因此,当我将节点插入NULL单元时,此代码工作正常。我尝试将其实现为将单元格发送到开头,但从那时起,display_list函数仅显示最后一个单元格。我一直想弄明白这一点。建议?
我将补充一点,这应该是一个在Linux中模仿dc的函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct CELL {
int val;
struct CELL *next;
};
void append_node(struct CELL *llist, int num);
void display_list(struct CELL *llist);
主要似乎很好
int main(void)
{
int num = 0;
int first = 0;
int input = 0;
char quit = 'n';
char inputchar = ' ';
struct CELL *llist;
llist = (struct CELL *)malloc(sizeof(struct CELL));
llist->next = NULL;
while (quit == 'n'){
if (scanf("%d", &input) == 1){
if ( first == 1 )
append_node(llist, input);
if ( first == 0){
llist->val = input;
first = 1;
}
}
else{
inputchar = getchar();
if (llist->next == NULL && first == 0)
printf("List is empty.\n");
if (inputchar == 'f')
display_list(llist);
if (inputchar == 'q')
quit = 'y';
else if (llist->next != NULL){
switch (inputchar){
case 'q':
quit = 'y';
break;
}
}
}
}
free(llist);
return 0;
}
注释掉的代码运行良好!直到我发现我应该将细胞添加到另一端,我很难搞清楚。我在这里缺少什么?
void append_node(struct CELL *llist, int num) {
/* while(llist->next != NULL)
llist = llist->next;
llist->next = (struct CELL *)malloc(sizeof(struct CELL));
llist->next->val = num;
llist->next->next = NULL;*/
struct CELL *temp;
temp = (struct CELL *)malloc(sizeof(struct CELL));
temp->val = num;
temp->next = llist;
llist = temp;
}
void display_list(struct CELL *llist)
{
while(llist->next != NULL) {
printf("%d\n", llist->val);
llist = llist->next;
}
printf("%d\n", llist->val);
}
我承认我很难知道何时应该使用指针,我怀疑我可能在某个地方遗失了一个。任何帮助将不胜感激。
答案 0 :(得分:3)
查看代码的这一部分,
void append_node(struct CELL *llist, int num) {
struct CELL *temp;
temp = (struct CELL *)malloc(sizeof(struct CELL));
temp->val = num;
temp->next = llist;
llist = temp; // Line1
}
注意第1行:当您将llist
更改为指向新节点时,您正在更改llist
的本地副本,而main中的llist
继续保留其旧值。
这是您设计链表时的一个缺陷。客户端程序(main)根本不应访问CELL
结构。你应该有另一个表示链表的结构,并有一个指向第一个单元格的指针。
像这样,
struct LinkedList {
struct CELL *head;
};
您的main
应该使用此结构,而不是CELL
。
我在代码中看到的其他内容很少,
1)display_list
函数将失败,如果NULL
传递给它。这样做可能会更好,
void display_list(struct CELL *llist)
{
while(llist != NULL) {
printf("%d\n", llist->val);
llist = llist->next;
}
}
2)在main
,
free(llist);
您只释放链接列表中的第一个单元格。您尚未释放添加到列表中的其他单元格。这将导致您的计划中出现Memory leak。
我该如何解决这个问题?释放链表不应该由客户端(主)代码完成。您应该提供另一个函数,它将递归释放所有已分配的单元格。同样,如果您按照上面建议的设计使用表示链表的结构,这会更容易。
编辑:在评论部分中添加了一个请求示例。
如果您将设计更改为我建议的内容,您的显示将如下所示
void display_list(struct LinkedList *llist)
{
struct CELL * head = llist->head;
while(head != NULL) {
printf("%d\n", head->val);
head = head->next;
}
}