#include<stdio.h>
#include<stdlib.h>
typedef struct list {
int data;
struct list *next;
} node;
void add(node **head, node **tail, int data) {
node *temp1, *temp2;
temp1 = (node*) malloc(sizeof(struct list));
temp1->data = data;
temp1->next = NULL;
if (*head == NULL) {
*head = temp1;
*tail = temp1;
} else {
for (temp2 = *head; temp2->next != NULL; temp2 = temp2->next)
temp2->next = temp1;
*tail = temp1;
}
}
int main() {
node *temp, *head, *tail;
head = NULL;
add(&head, &tail, 1);
add(&head, &tail, 2);
add(&head, &tail, 3);
add(&head, &tail, 4);
for (temp = head; temp != (node *) 0; temp = temp->next) {
printf("[%d]->", (temp->next));
}
printf("[NULL]\n\n");
}
错误是什么,为什么不打印? 什么是错误,为什么只打印[0] - &gt; NULL?我尝试了各种形式,但我无法这样做。问题是什么? 指针有问题吗?或者没有分配足够的内存?
答案 0 :(得分:3)
您在for循环中缺少一条陈述:
for(temp2=*head; temp2->next!=NULL; temp2=temp2->next)
temp2->next=temp1;
*tail=temp1;
这将作为
执行for(temp2=*head; temp2->next!=NULL; temp2=temp2->next) {
temp2->next=temp1;
}
*tail=temp1;
您只需为({}
)或;
for(temp2=*head; temp2->next!=NULL; temp2=temp2->next) {}
temp2->next=temp1;
*tail=temp1;
您的printf
声明中可能还需要
printf("[%d]->",(temp->data));
答案 1 :(得分:2)
我认为你不必使用for循环。如果我理解正确,你想在列表的末尾添加一个元素。所以就这样做:
// if list is empty ...
if (*head == NULL) {
// ... insert new node
*head = temp1;
*tail = temp1;
}
// ... otherwise ...
else {
// ... insert new node at tail ...
(*tail)->next = temp1;
// ... then move tail to new node
*tail = temp1;
}
它之所以有用,是因为你不必找到列表的末尾,你已经知道它在哪里:它是*tail
!因此,您只需将元素添加到tail
的下一个指针,然后移动tail
- 指针本身......
输出为:
[1]->[2]->[3]->[4]->[NULL]
正如Salem指出你应该修复你的printf
:
printf("[%d]->", (temp->data));