我正在开发一个代码,将一个节点插入到链表的末尾,而它只是不起作用。它给了我与以前相同的链表,没有附加任何节点。
the old list is :
9 8 7 6 5 4 3 2 1 0
the new list is :
9 8 7 6 5 4 3 2 1 0
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//make a new type structure called node
typedef struct nodes{
int n;
struct nodes* next;
}node;
//assigning the first node of the linked list
node* head=NULL;
//append function
void append(int number){
node* tail=malloc(sizeof(node));
if(tail==NULL){
printf("unable to allocate");
exit(1);
}
tail->n=number;
tail->next=NULL;
if(head->next==NULL){
tail->next=head;
printf("added successfully");
}
else{
for(node* current=head;current->next==NULL;current=current->next){
current->next=tail;
printf("Added successfully");
break;
}
}
}
//main function
int main(int argc,char* argv[]){
//checking that the commmand is correct
if(argc!=2){
printf("Please type ./append and then type the number you want to add to the list");
}
//accept numbers in second argument
int newnumber=atoi(argv[1]);
//make the list
for(int i=0;i<10;i++){
node* newnode=malloc(sizeof(node));
//checking
if(new==NULL){
exit(1);
}
newnode->n=i;
newnode->next=head;
head=newnode;
}
//printing the old list
printf("the old list is :\n");
for(node* conductor=head;conductor!=NULL;conductor=conductor->next){
printf("%i ",conductor->n);
}
//append the number given to the start of the linked list
append(newnumber);
//printing the new list
printf("\nthe new list is :\n");
for(node* conductor=head;conductor!=NULL;conductor=conductor->next){
printf("%i ",conductor->n);
}
printf("\n");
return 0;
}
所以功能似乎根本没有影响。我看不出bug在哪里。
答案 0 :(得分:2)
node* tail=malloc(sizeof(node));
您创建了一个名为tail的新节点*。它还没有任何关联。
首先,如评论中所述,如果列表为空,您的代码可能会取消引用NULL指针。例如,您可以在开头添加以下检查:
if(head==NULL) {
head=tail;
printf("Added successfully\n");
return;
}
现在让我们来看看你的代码:
if(head->next==NULL){
tail->next=head;
printf("added successfully");
}
在这里你指定tail->next
而不是head->next
,所以你的尾巴仍然不在列表中,这是一个错误。
else{
for(node* current=head;current->next==NULL;current=current->next){
current->next=tail;
printf("Added successfully");
break;
}
}
这里你的循环条件是错误的。对于初学者来说,==应该是!=。现在你的循环根本没有执行。
然后你仍然需要将循环体取出循环:
else {
node* current=head;
while (current->next!=NULL)
current=current->next;
current->next=tail;
printf("Added successfully");
}
但实际上这些都是非常简单的错误,你应该能够通过仔细观察来捕捉它们。
答案 1 :(得分:1)
append
函数中的逻辑在两种情况下都是假的:如果列表为空,则您的测试不正确,您只需修改tail->next
而不是head
,如果列表是不是空的,你完全没有做任何事情,因为current {&gt; next NULL
循环开始时不是for
。
请查看此更正版本:
void append(int number) {
node *tail = malloc(sizeof(node));
if (tail == NULL) {
printf("unable to allocate");
exit(1);
}
tail->n = number;
tail->next = NULL;
if (head == NULL) {
head = tail;
} else {
node *current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = tail;
}
printf("Added successfully");
}