C-双链表始终为空
我正在用以下数据结构在双链表上编写一个程序:C-双链表始终为空,c,linked-list,doubly-linked-list,C,Linked List,Doubly Linked List,我正在用以下数据结构在双链表上编写一个程序: typedef struct telephoneBookNode { int id; char name[NAME_LENGTH]; char telephone[TELEPHONE_LENGTH]; struct telephoneBookNode * previousNode; struct telephoneBookNode * nextNode; } TelephoneBookNode; typede
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;
}
}
这是创建列表的函数,问题可能在这里:它不向列表中添加新节点,只是用新节点替换第一个节点。最后,链表只有一条记录,这是文本文件中的最后一条记录。如何修复代码?谢谢大家!
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;
}
}
}
}
布尔地址BookEntryCheck(字符条目[]){
字符*代币;
令牌=strtok(条目,“,”);
如果(!令牌| | strlen(令牌)<1 | | strlen(令牌)>3)
返回FALSE;
否则{
如果(!isNumber(令牌))
返回FALSE;
否则{
令牌=strtok(NULL,“,”);
如果(!令牌)
返回FALSE;
其他的
{
令牌=strtok(NULL,“,”);
如果(!令牌)
返回FALSE;
如果(!isNumber(令牌)| strlen(令牌)!=10,则为else)
返回FALSE;
其他的
返回TRUE;
}
}
}
}
这是因为函数的调用者传递了阳极
,并且它在该循环中从不更改。因此,它将始终传递相同的阳极值,即NULL
我还没有详细研究代码的逻辑,但我认为您可能希望通过aList->head
,或者您已经通过aList
,所以请使用它
这是因为函数的调用者传递了阳极
,并且它在该循环中从不更改。因此,它将始终传递相同的阳极值,即NULL
我没有详细研究代码的逻辑,但我认为您可能希望通过aList->head
,或者您已经通过aList
,所以每次调用时都使用它。
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);
然后每次打电话时都将其添加到您的列表中
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);
然后添加到您的列表中
供参考,节点=…
对函数的调用者来说毫无意义。该指针是通过值传递的(在函数内部,您所做的所有更改都是一个自动的局部变量)。addressBookEntryCheck
是什么样子的?如果它总是返回true,那么您将得到所描述的行为。如果我是你,我会让函数做得少一点,以便于遵循,即一个函数创建列表标题,一个函数添加节点。我添加了函数addressBookEntryCheck
,它实际上总是返回false
,输入格式甚至没有问题。我尝试了很多方法,但程序总是返回空列表,真的不知道如何修复。您尝试过调试吗?仅供参考,node=…
对函数的调用方来说毫无意义。该指针是通过值传递的(在函数内部,您所做的所有更改都是一个自动的局部变量)。addressBookEntryCheck
是什么样子的?如果它总是返回true,那么您将得到所描述的行为。如果我是你,我会让函数做得少一点,以便于遵循,即一个函数创建列表标题,一个函数添加节点。我添加了函数addressBookEntryCheck
,它实际上总是返回false
,我尝试了很多方法,但是程序总是返回一个空列表,真的不知道如何修复它你试过调试吗?