【问题标题】:linked list in C. Can't add element at the endC中的链表。不能在最后添加元素
【发布时间】:2014-03-18 15:36:41
【问题描述】:

你好,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct data{
    int a;
    struct data *p;
}data;

void add(data *begin, data *new);

int main(void){
    data *first = malloc(sizeof(data));
    data *second = malloc(sizeof(data));
    data *third = malloc(sizeof(data));
    first->a = 1;
    first->p = second;
    second->a = 2;
    second->p = third;
    third->a = 3;
    third->p = NULL;
    data *new = malloc(sizeof(data));
    new->a = 4;
    add(first, new);
    data *temp = first;
    do{
        printf("%i\n", temp->a);
        temp = temp->p;
    }
    while(temp->p != NULL);
    return 0;
}

void add(data *begin, data *new){
     data *temp = malloc(sizeof(data));
     temp = begin;
     while(1){
        if(temp->p == NULL){
            temp->p = new;
            break;
        }
        else{
            temp = temp->p;
        }
     }
}

代码很简单。但是当我运行它时,我总是得到 3 (它不会添加新列表)。请帮助我,我找不到类似的问题,可以帮助我。

【问题讨论】:

  • 我希望你在 c 工作;在 c++ 中,“new”是保留关键字;这不是一个明智的命名选择......
  • 是的,我正在使用 C,检查我包含的库(stdio 和 stdlib)。
  • new 在 oldschool c 中也不是明智的命名选择,恕我直言。另外,你能解释一下为什么你在 add 中使用 malloc 吗?

标签: c struct linked-list


【解决方案1】:

这些行:

 data *temp = malloc(sizeof(data));
 temp = begin;

1 件事是错误的,因为您首先分配内存然后不使用它。你应该像data *temp = NULL;一样初始化temp变量。

这就是为什么你只得到前 3 个项目:

do{
    printf("%i\n", temp->a);
    temp = temp->p;
}
while(temp->p != NULL);

当一个项目没有下一个项目时,您的循环停止(因此它停止得太早)。

相反,请执行以下操作:

do {
    printf("%i\n", temp->a);
    temp = temp->p;
} while(temp != NULL);

【讨论】:

  • 我看不出你和我的 do-while 循环有什么区别。只有那个while在do循环结束的同一行,但我复制了它并且它起作用了。你能解释一下原因吗?
  • 如果您使用简单的while 循环而不是do 循环可能会更明显。在您的代码中,当您所在的节点具有NULL next 时,您在打印之前终止。所以,尾巴永远不会被打印出来。在新代码中,当tempNULL 时终止,这发生在打印尾部之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多