在 C 中创建单链表
Posted
技术标签:
【中文标题】在 C 中创建单链表【英文标题】:Creating a singly linked list in C 【发布时间】:2011-01-19 13:02:19 【问题描述】:我正在尝试从输入文本文件创建一个单链表以进行分配。我试着一次做一点,所以我知道我的代码不完整。我尝试创建头指针并打印出它的值,但我什至无法让它工作,但我不知道为什么。我包括了结构、我的创建列表和打印列表函数。我没有包含打开的文件,因为该部分有效。
typedef struct List
struct List *next; /* pointer to the next list node */
char *str; /* pointer to the string represented */
int count; /* # of occurrences of this string */
LIST;
LIST *CreateList(FILE *fp)
char input[LINE_LEN];
LIST *root; /* contains root of list */
size_t strSize;
LIST *newList; /* used to allocate new list members */
while (fscanf(fp, BUFFMT"s", input) != EOF)
strSize = strlen(input) + 1;
/* create root node if no current root node */
if (root == NULL)
if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL)
printf("Out of memory...");
exit(EXIT_FAILURE);
if ((char *)malloc(sizeof(strSize)) == NULL)
printf("Not enough memory for %s", input);
exit(EXIT_FAILURE);
memcpy(newList->str, input, strSize); /*copy string */
newList->count = START_COUNT;
newList->next = NULL;
root = newList;
return root;
/* Prints sinly linked list and returns head pointer */
LIST *PrintList(const LIST *head)
int count;
for (count = 1; head != NULL; head = head->next, head++)
printf("%s %d", head->str, head->count);
return head; /* does this actually return the start of head ptr, b/c I want to
return the start of the head ptr. */
【问题讨论】:
你不想在PrintList
中有head++
,head = head->next
已经增加了指针。
你问过这个问题两次了吗..? ***.com/questions/2309618/single-linked-lists-in-c
【参考方案1】:
您不应该在 for 循环中的 head = head->next
之后增加 head。 PrintList 每次都会返回 NULL,因为循环不会停止,直到 head 为 NULL。为什么还需要返回刚刚传递给函数的列表的头部?
编辑:
LIST *current = head;
while (current != NULL)
printf("%s %d", current->str, current->count);
current = current->next;
【讨论】:
正是我的教授想要的。 const char * 参数让我对如何遍历循环感到困惑。 你应该创建一个指向当前节点的指针并用head初始化它。然后在归还之前不要再碰头。【参考方案2】:第二个malloc分配内存但它的返回值没有分配给任何东西,所以分配的内存丢失了。
newList 已分配但未初始化,因此使用 memcpy 将内存复制到 newList->str 将失败,因为 newList->str 指向任何内容。可能您希望将第二个 malloc 的结果分配给 newList->str,但您忘记了。
【讨论】:
【参考方案3】:root
有一个未定义的值,所以它不会初始化。 CreateList
的第二行应该是
LIST *root = NULL;
此外,显然还有分配项的详细信息,但是 a) 代码无法捕获分配并将其保存在任何地方,并且 b) 分配的大小应该是 strSize
,而不是长度变量本身。有几种方法可以解决它,但最简单的方法是:
newList->str = (char *)malloc(strSize);
if (newList->str == NULL)
【讨论】:
以上是关于在 C 中创建单链表的主要内容,如果未能解决你的问题,请参考以下文章