一些帮助链接lIst

时间:2010-02-24 01:47:44

标签: c linked-list

好的,我已经更新了我的代码了。我遇到了一个新问题,但似乎正在走上正确的道路。现在,当我输入数字时,它会不断吐出我输入的第一个数字而不是移动到下一个数字。

的main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <cType.h>
#include "list.h"


#define amount 3 

//Prototypes
void printList(LIST* number);

int main(){
    int i;
    int* dataPtr;
    int number;

    LIST* numberList;
    numberList = createList();

    printf("Please enter %d numbers for the linked list\n", amount);

    for(i = 0; i < amount; i++){
          printf("#%d: ", i+1);
          scanf("%d", &number);
          dataPtr = malloc(sizeof(int));
          *dataPtr = number;
          addNode(numberList, dataPtr);
    }
    printList(numberList);
    system("PAUSE");    
    return 0;
}

void printList(LIST* number){
     int* dataPtr;
     while (!emptyList(number)){
           traverse(number,0, (void*)&dataPtr);
           printf("%d\n", *dataPtr);
           addNode(number, dataPtr);
     }
}

list.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <cType.h>

//List ADT Type Definitions
typedef struct node{
        void* dataPtr;
        struct node* link;
        } NODE;

typedef struct{
        int count;
        NODE* pos;
        NODE* head;
        NODE* rear;
        } LIST;
//Prototype Declarations
LIST* ceateList(void);

bool traverse (LIST* pList, int fromWhere, void** dataOutPtr);

int listCount (LIST* pList);
bool emptyList (LIST* pList);
bool fullList (LIST* pList);

bool addNode (LIST* pList, void* dataInPtr);

list.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <cType.h>

#include "list.h"

LIST* createList(void){
      LIST* list;

      list = (LIST*) malloc (sizeof(list));

      if(list){
               list->head = NULL;

               list->rear = NULL;
               list->count = 0;
      }
      return list;
}

bool addNode(LIST* pList, void* dataInPtr){
       NODE* pNew;

       if(!(pNew = (NODE*) malloc(sizeof(NODE))))
                 return false;

       pNew->dataPtr = dataInPtr;
       pNew->link =  NULL;

       if(pList->count == 0){
               pNew->link = pList->head;
               pList->head = pNew;
               if(pList->count == 0)
                 pList->rear = pNew;
       }
       else{
            pNew->link = pNew;

            if(pNew->link == NULL)
               pList->rear = pNew;
       }
       (pList->count)++;
       return true;
}


bool emptyList(LIST* pList){
     return(pList->count == 0);
}

bool fullList(LIST* pList){
     NODE* temp;

     if((temp = (NODE*)malloc(sizeof(*(pList->head))))){
              free(temp);
              return false;
     }
     return true;
}

int listCount(LIST* pList){
    return pList->count;
}

bool traverse(LIST* pList, int fromWhere, void** dataPtrOut){
     if(pList->count == 0)
                     return false;

     if(fromWhere == 0){
                  pList->pos = pList->head;
                  *dataPtrOut = pList->pos->dataPtr;
                  return true;
     }
     else{
          if (pList->pos->link == NULL)
             return false;
          else{
               pList->pos = pList->pos->link;
               *dataPtrOut = pList->pos->dataPtr;
               return true;
          }
     }
}

3 个答案:

答案 0 :(得分:5)

list = (LIST*) malloc (sizeof(list));

你有指针的大小,而不是结构的大小。

答案 1 :(得分:1)

当您致电_insert()时,您尚未初始化pPre。在C中,未初始化的内存不是nessescarily NULL

此外,如果我是你,我会从pos类型中删除LIST指针 - 使用它会使您的代码非常不可重入。

答案 2 :(得分:0)

我认为学习使用调试器是个好主意。它是任何开发技能的重要组成部分。

如果这是在使用gcc的Linux系统上(最有可能),那么使用-g编译代码并使用gdb运行它。如果你需要更多的指导,那么就这么说

PS:我同意早先的海报,你不应该使用全部大写变量名。传统上所有大写字母都用于宏和常量