【发布时间】:2014-11-14 07:33:19
【问题描述】:
我有 2 个函数,CreateNewNode,一个创建新节点的函数,以及 Add_as_Last_Node,一个将 CreateNewNode 中创建的节点添加为链表中最后一个节点的函数。在运行我使用这两个函数制作的程序时,输出结果不是我所期望的。
例如,如果我是用户,我想做一个 5 个节点的链表,我的输入是“apple”、“bag”、“car”、“dress”和“elephant”,当我遍历并打印输出的节点是:
大象 大象 大象 大象 大象
什么时候应该:
苹果 包 车 裙子 大象
在研究我的代码几个小时后,我发现我的程序的问题在于 CreateNewNode 或 Add_as_Last_Node。或者两者兼而有之。我试过追踪它,但没有找到它的问题所在。有人可以帮我找出问题所在吗?谢谢! :)
typedef char Str30[31];
struct nodeTag {
char *data;
struct nodeTag *pNext;
};
void Traverse(struct nodeTag *pCurrent)
{
while(pCurrent){ // while there's a node
printf("%s\n", pCurrent->data);
pCurrent = pCurrent->pNext; // move to the next node
}
}
struct nodeTag *CreateNewNode(Str30 data)
{
struct nodeTag *pTemp;
//create and initialize a new node
pTemp = malloc(sizeof(struct nodeTag));
pTemp->data = data;
pTemp->pNext = NULL;
return pTemp;
}
struct nodeTag *Add_as_Last_Node(struct nodeTag *pFirst, struct nodeTag *pTemp)
{
struct nodeTag *pCurrent;
if(pFirst == NULL){ // list is empty
pFirst = pTemp;
}
else {
pCurrent = pFirst;
while(pCurrent->pNext != NULL)
pCurrent = pCurrent->pNext;
pCurrent->pNext = pTemp;
}
return pFirst;
}
int main()
{
Str30 data;
struct nodeTag *pFirst = NULL;
struct nodeTag *pTemp;
while(scanf("%s", data) != -1){
pTemp = CreateNewNode(data);
pFirst = Add_as_Last_Node(pFirst, pTemp);
}
Traverse(pFirst);
return 0;
}
这是我正在使用的实际代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char Str30[31];
struct nodeTag {
char *data;
struct nodeTag *pNext;
};
void Traverse(struct nodeTag *pCurrent)
{
// traverse the linked list
while(pCurrent){ // while there's a node
printf("%s\n", pCurrent->data);
pCurrent = pCurrent->pNext; // move to the next node
}
}
struct nodeTag *CreateNewNode(Str30 data)
{
struct nodeTag *pTemp;
//create and initialize a new node
pTemp = malloc(sizeof(struct nodeTag *));
//strcpy(pTemp->data, data);
pTemp->data = data;
pTemp->pNext = NULL;
return pTemp;
}
struct nodeTag *Add_as_Last_Node(struct nodeTag *pFirst,
struct nodeTag *pTemp)
{
struct nodeTag *pCurrent;
if(pFirst == NULL){ // list is empty
pFirst = pTemp;
}
else {
pCurrent = pFirst;
while(pCurrent->pNext != NULL)
pCurrent = pCurrent->pNext;
pCurrent->pNext = pTemp;
}
return pFirst;
}
struct nodeTag *Insert_Sort(struct nodeTag *pFirst,
struct nodeTag *pTemp)
{
struct nodeTag *pTrail;
struct nodeTag *pCurrent;
if(pFirst == NULL)
pFirst = pTemp;
else{
pTrail = NULL;
pCurrent = pFirst;
while(pCurrent->pNext != NULL){
pTrail = pCurrent;
pCurrent = pCurrent->pNext;
}
pTemp->pNext = pCurrent;
if(pTrail != NULL)
pTrail->pNext = pTemp;
else
pFirst = pTemp;
}
return pFirst;
}
int main()
{
int ctr = 0;
Str30 data;
// Str30 universe;
struct nodeTag *pFirst = NULL;
struct nodeTag *pTemp;
while(ctr != 3 && scanf("%s", data) != -1){
printf("\ndata = %s\n", data);
pTemp = CreateNewNode(data);
printf("\nAfter CreateNewNode: \n\n");
Traverse(pFirst);
pFirst = Add_as_Last_Node(pFirst, pTemp);
printf("\nAfter Add_as_Last_Node: \n\n");
Traverse(pFirst);
ctr++;
}
Traverse(pFirst);
printf("\n%d\n", ctr);
return 0;
}
现在这就是我用来测试我的代码有什么问题的方法。
【问题讨论】:
-
您的编译器应该抱怨
pTemp->data = data;:您是否按照建议尝试过strcpy?它对我有用。 -
等等!!! 请勿在没有编辑注释的情况下编辑代码。并且您的最新编辑 [
char * data] 是错误的。可能的传入分段错误。 -
编辑它,应该是'char *data',就像在我的实际程序中一样。
-
那你也需要
malloc。 -
哦抱歉,为什么
char *data;错了?它没有产生语法错误。
标签: c linked-list nodes singly-linked-list