2016-05-13 16 views
1

我的双向链表上书面方式程序与数据结构如下:Ç - 双向链表总是空

typedef struct telephoneBookNode { 
    int id; 
    char name[NAME_LENGTH]; 
    char telephone[TELEPHONE_LENGTH]; 
    struct telephoneBookNode * previousNode; 
    struct telephoneBookNode * nextNode; 
} TelephoneBookNode; 

typedef struct telephoneBookList { 
    TelephoneBookNode * head; 
    TelephoneBookNode * tail; 
    TelephoneBookNode * current; 
} TelephoneBookList; 

在下面的功能,我从一个文本文件中读取数据到链表中,文件内容是这样的:

/*100, Alice, 0411112222 
101, Bob, 0411112222 
102, Ali, 0411112223*/ 

TelephoneBookList * commandLoad(char* fileName) { 
    TelephoneBookList *(*createList)(TelephoneBookNode*, char[]) = createTelephoneBookList; 

    char entry[100], *temp1, *temp2; 
    TelephoneBookList* aList = NULL; 
    TelephoneBookNode* aNode = NULL; 
    FILE* telephoneListFile = NULL; 
    int countEntry = 0; 
    Boolean check; 

    telephoneListFile = fopen(fileName, "r"); 

    if (!telephoneListFile) 
     return NULL; 
    else { 
     while (fgets(entry, 100, telephoneListFile)) { 
      temp2 = strcpy(temp2, entry); 
      temp1 = strtok(entry, "\n"); 
      check = addressBookEntryCheck(temp1); 

      if (!check) 
       return NULL; 
      else 
       //here I pass aNode pointer to the below function 
       aList = (*createList)(aNode, temp2); 
     } 
     fclose(telephoneListFile); 
     printf("printed"); //This line is reached when program complied 
     return aList; 
    } 
} 

这是创建列表的功能,问题可能出在这里:它亘古不增加新的节点列表,它只是替换为新的一个第一个节点。最后,链表只有1个记录,它是文本文件中的最后一个记录。我如何修复代码?谢谢!

TelephoneBookList * createTelephoneBookList(TelephoneBookNode* node, char entry[]) { 
    TelephoneBookList* aList = malloc(sizeof *aList); 
    TelephoneBookNode* aNode = (TelephoneBookNode*) malloc(sizeof *aNode); 
    char *tokens; 

    tokens = strtok(entry, ", "); 
    aNode->id = atoi(tokens); 

    tokens = strtok(NULL, ", "); 
    strcpy(aNode->name, tokens); 

    tokens = strtok(NULL, ", "); 
    strcpy(aNode->telephone, tokens); //Just assigning values to a node 

    //program always go to this block, means `node` is always null 
    if (node == NULL) { 
     aNode->nextNode = NULL; 
     aNode->previousNode = NULL; 
     node = aNode; 

     aList->current = node; 
     aList->head = node; 
     aList->tail = node; 
    } 
    else { //This block is not reached 
     while (node->nextNode) 
      node = node->nextNode; 

     node->nextNode = aNode; 
     aNode->previousNode = node; 

     aList->tail = node->nextNode; 
    } 
    return aList; 
} 

这是检查函数入口:

Boolean addressBookEntryCheck(char entry[]) { 
    char *tokens; 

    tokens = strtok(entry, ", "); 

    if(!tokens || strlen(tokens) < 1 || strlen(tokens) > 3) 
     return FALSE; 
    else { 
     if (!isNumber(tokens)) 
      return FALSE; 
     else { 
      tokens = strtok(NULL, ", "); 

      if (!tokens) 
       return FALSE; 
      else 
      { 
       tokens = strtok(NULL, ", "); 

       if (!tokens) 
        return FALSE; 
       else if (!isNumber(tokens) || strlen(tokens) != 10) 
        return FALSE; 
       else 
        return TRUE; 
      } 
     } 
    } 
} 
+0

据透露, 'node = ...'对你函数的*调用者没有意义。该指针是通过值传递的(所有更改都是在函数内部的自动局部变量)。 – WhozCraig

+0

如何'addressBookEntryCheck'样子?如果它总是返回true,你会得到你描述的行为。如果我是你,我会让这个功能做的更少一些,使得它更容易遵循,即一个函数创建列表头,一个添加节点。 –

+0

我已经添加了函数'addressBookEntryCheck',它实际上总是返回'false',甚至没有错误的入口格式。 –

回答

0

每次调用

createTelephoneBookList 

创建一个新的列表时,

TelephoneBookList* aList = malloc(sizeof *aList); 

也复制到未初始化的指针

temp2 = strcpy(temp2, entry); 

我会建议你创建一个函数来创建列表标题,一个函数添加新项目,例如

aList = createList() 
while (fgets(entry,sizeof(entry),fp)!=NULL) 
{ 
    if (!addEntry(aList,entry)) 
    { 
    fprintf(stderr, "failed additem item %s\n", entry); 
    } 
} 
... 

在addEntry的解析字符串

int id = 0; 
char name[NAME_LENGTH]; 
char telephone[TELEPHONE_LENGTH]; 

p = strtok(entry, ","); // id 
if (p != NULL) 
{ 
    id = atoi(p); 
    p = strtok(NULL, ","); // name, store to temporary string 
    if (p != NULL) 
    { 
    strcpy(name,p); 
    p = strtok(NULL, ","); // telephone number, store to temporary string 
    if (p != NULL) 
    { 
     strcpy(telephone,p); 

     // here you can allocate the new node 
    } 
    } 
} 

// disclaimer omitted checks for length etc which any good program should have. also make sure you have room for \0 

如果上述任何strtok失败返回0,否则分配一个新的条目

TelephoneBookNode* aNode = malloc(sizeof(TelephoneBookNode)); 
aNode->id = id; 
strcpy(aNode->name, name); 
strcpy(aNode->telephone, telephone); 

然后添加到您的aList

0
//program always go to this block, means `node` is always null 
    if (node == NULL) { 
    .... 

这是因为该函数的调用者通过aNode,它从来不是循环内改变。因此,它总是会通过的aNode这是NULL相同的值。

我还没有详细看过你的代码的逻辑,但我想你可能想通过aList->head,或者你已经通过aList,所以就使用它。