首页 > 解决方案 > 删除链表上的头部

问题描述

我是 c 新手,正在尝试做作业。我需要创建数据并将其插入到链表中,然后打印它并删除列表中的一个节点。

    #include<stdio.h>
    #include<stdlib.h>



    typedef struct node{
        int data;
        struct node * next;
    }node;


    void printlist(node *head);
    void dele(int del,node * head);
    node * create(int n);



    int main(){
        int n=0,del;
        node * head=NULL;
        printf("Enter Number of Data: ");
        scanf("%d",&n);
        head=create(n);
        printf("Data in linked list are : ");
        printlist(head);
        printf("\nEnter Data yout want to delete : ");
        scanf("%d",&del);
        dele(del,head);
        printf("Data remained in linked list are : ");
        printlist(head);
        return 0;
    }

    node * create (int n){
        int i=0;
        node * head = NULL;
        node * temp = NULL;
        node * p = NULL;

        for(i=0;i<n;i++){
            temp = (node*)malloc(sizeof(node));
            printf("Enter Data%d : ",i+1);
            scanf("%d",&(temp->data));
            temp->next=NULL;

            if(head==NULL){
                head= temp;
            }
            else{
                p = head;
                while(p->next != NULL){
                    p=p->next;

                }
                p->next=temp;
            }
        }

        return head;
    }

    void printlist(node * head){
        node *n=head;
        while(n!=NULL){
        printf("%d ",n-> data);
        n=n->next;
        }
    }
    void dele(int del,node * head){
        int found = 0, position = 0, i;
      struct node *temp = head;
      struct node *prev = NULL;

      while(temp != NULL)
      {

        if(temp->data == del )
        {
            if(prev == NULL){ /*If the node is the head*/
                head = head->next;
                delete temp;
                return ;
            }else{
                prev->next = temp->next;
                delete temp;
                return ;
            }
        }
        prev = temp;
        temp = temp->next;
      }


    }

一切正常,但是当我尝试删除第一个节点时出现问题,随机数开始出现。

但是当我尝试删除其他节点时,它会完美地显示结果。有什么解决办法吗?

标签: clinked-list

解决方案


您必须更改dele这种方式的签名:

void dele(int del, node ** head)

然后你必须相应地调整内容,这行对你的问题特别重要:

if (prev == NULL){ /* If the node is the head */
    
    if (head) *head = (*head)->next;
}

最后你dele通过传递一个指针来调用head

dele(del, &head);

这样,新的head将在函数之外可见(它不在您当前的代码中)。


推荐阅读