C.Can';t在末尾添加元素
你好,这是我的代码:C.Can';t在末尾添加元素,c,struct,linked-list,C,Struct,Linked List,你好,这是我的代码: #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
#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;
}
}
}
#包括
#包括
typedef结构数据{
INTA;
结构数据*p;
}数据;
作废添加(数据*开始,数据*新);
内部主(空){
data*first=malloc(sizeof(data));
data*second=malloc(sizeof(data));
数据*third=malloc(sizeof(数据));
第一->a=1;
第一->p=第二;
第二->a=2;
第二->p=第三;
第三->a=3;
第三->p=NULL;
data*new=malloc(sizeof(data));
新建->a=4;
增加(第一,新的);
数据*温度=第一;
做{
printf(“%i\n”,temp->a);
温度=温度->p;
}
而(临时->p!=NULL);
返回0;
}
作废添加(数据*开始,数据*新){
数据*temp=malloc(sizeof(数据));
温度=开始;
而(1){
如果(临时->p==NULL){
温度->p=新的;
打破
}
否则{
温度=温度->p;
}
}
}
代码很简单。但当我运行它时,我总是得到3(它不会添加新列表)。请帮助我,我找不到类似的问题,那可以帮助我 这些行:
data *temp = malloc(sizeof(data));
temp = begin;
有一件事是错误的,因为你首先分配内存,然后不使用它。您应该初始化temp
变量,如data*temp=NULL代码>
这就是为什么您只获得前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);
这些线路:
data *temp = malloc(sizeof(data));
temp = begin;
有一件事是错误的,因为你首先分配内存,然后不使用它。您应该初始化temp
变量,如data*temp=NULL代码>
这就是为什么您只获得前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);
我希望你在c工作;在C++中,“新”是一个保留关键字;这不是一个明智的命名选择…是的,我正在使用C,检查我包含的库(stdio和stdlib)。在旧的C中,新的命名也不是一个明智的选择,imho。另外,你能解释一下为什么你在add中使用malloc吗?我希望你在c中工作;在C++中,“新”是一个保留关键字;这不是一个明智的命名选择…是的,我正在使用C,检查我包含的库(stdio和stdlib)。在旧的C中,新的命名也不是一个明智的选择,imho。另外,你能解释一下为什么在add中使用malloc吗?我看不出你的do-while循环和我的do-while循环有什么区别。只是while在do循环结束的同一行上,但是我复制了它,它工作了。你能解释一下原因吗?如果你用一个简单的while
循环而不是do
循环,可能会更明显。在您的代码中,当您所在的节点在打印它之前有一个NULL
next
时终止。所以,尾巴永远不会被打印出来。在新代码中,当temp
为NULL
时终止,这发生在打印尾部之后。我看不出您和我的do-while循环之间有任何区别。只是while在do循环结束的同一行上,但是我复制了它,它工作了。你能解释一下原因吗?如果你用一个简单的while
循环而不是do
循环,可能会更明显。在您的代码中,当您所在的节点在打印它之前有一个NULL
next
时终止。所以,尾巴永远不会被打印出来。在新代码中,当temp
为NULL
时终止,这在打印尾部后发生。