C语言 链表追加函数在开头添加一个额外的空节点


            struct node{
                char name[50];
                double grade;
                struct node* next;

            };


            void append(struct node* root){
                int n;
                printf("Enter the number of students: ");
                scanf("%d",&n);
                while(n !=0){
                    struct node* temp;
                    temp=(struct node*)malloc(sizeof(struct node));
                    printf("nEnter the name of the student: ");
                    scanf("%s",&temp->name);
                    printf("nEnter the grade for the student named %s: ",temp->name);
                    scanf("%f",&temp->grade);
                    temp->next=NULL;
                    if(root==NULL){
                       root=temp;
                    }else{
                        struct node* iterate=root;
                        while(iterate->next != NULL){
                            iterate=iterate->next;
                        }
                        iterate->next=temp;
                    }
                n--;
                }

            }
int listLength(struct node* root){
    struct node* temp = root;
    int counter=0;
    while(temp !=NULL){
        counter++;
        temp=temp->next;
    }
    return counter;
}
      int main()
        {
            struct node* root = NULL;
            append(&root);
            //printList(&root);
            printf("Node length: %d",listLength(&root));
            return 0;
        }

这就是我从链表开始时所拥有的。我试图做到这一点,以便我可以使用该函数附加到多个链表。所以我只是在 main 中创建一个不同的根指针,并调用 append 函数作为参数来添加节点。

这似乎有效,但是,它在列表的开头添加了一个额外的空节点。此节点不包含任何数据。例如,如果我在列表中添加 4 个学生,nodeLength 函数将返回 5。

更改以下内容:

void append(struct node* root)

对此:

void append(struct node** root)

这样即使更改终止,也可以使更改持续append()

当然,您将不得不使用*root而不是在该函数的主体内部使用root


PS:我投下马洛克的结果吗?不。

        struct node{
            char name[50];
            double grade;
            struct node* next;
        };
        struct node * append(struct node* root){
            int n;
            printf("Enter the number of students: ");
            scanf("%d",&n);
            while(n !=0){
               struct node* temp;
                temp=(struct node*)malloc(sizeof(struct node));
                printf("nEnter the name of the student: ");
                scanf("%s",&temp->name);
                printf("nEnter the grade for the student named %s: ",temp->name);
                scanf("%f",&temp->grade);
                temp->next=NULL;
                if(root==NULL){
                   root=temp;
                }else{
                    struct node* iterate=root;
                    while(iterate->next != NULL){
                        iterate=iterate->next;
                   }
                    iterate->next=temp;
                    root=iterate;
                }
            n--;
            }
      return root;            }
 int nodeLength(struct node* root){
       struct node* temp = root;
       int counter=0;
       while(temp !=NULL){
           counter++;
           temp=temp->next;
       }
      return counter;
}
int main()
{
      struct node* root = NULL;
      root= append(root);
      //printList(&root);
      printf("Node length: %d",nodeLength(root));
      return 0;
}

检查此代码以了解一点。会解释更多。

并且不要强制转换malloc的返回类型。

如果您正确地将参数更改为 struct node**,您正在做的事情将正常工作,但是是的,它可以像这样更容易地完成(上面显示的示例(。这是自然的,更直观的,而不是使用双指针。

相关内容

最新更新