编程语言
首页 > 编程语言> > 第二章 链表 递归算法删除不带头结点的单链表值为x的节点

第二章 链表 递归算法删除不带头结点的单链表值为x的节点

作者:互联网

#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct LinkedList{
    int data;
    struct LinkedList *next;//指针 
}LinkedList;

int a[4]={1,2,3,4};
int n=4;

void buildList(LinkedList *l){
    LinkedList *s;
    LinkedList *temp=l;
    temp->data=a[0];
    if(n==1){
        temp->next=NULL;
    }else{
        for(int i=1;i<n;i++){
            s=(LinkedList *)malloc(sizeof(LinkedList));
            s->data=a[i];
            temp->next=s;
            temp=temp->next;//一开始temp指向的是a[0],执行完这一条temp指向的是当前数组的i 
        }
        temp->next=NULL;//这里要加上 temp指向的后一个元素为空 否则while循环不终止 
    }
}

void show(LinkedList *l){
    LinkedList *s=l;
    while(s){//指向了链表头 
        printf("%d  ",s->data);
        s=s->next;
    }

void del(LinkedList *&l,int x){//也许会修改l指针当前指向链表的元素地址所以加一个&符 
//如果我们不加&不修改地址而且还free(temp)那么释放完后当前的temp中仍然后原来的数据
//指针就会指向别的地方 
    if(l==NULL){
        return;
    }
    LinkedList *temp;//第一个节点 
        if(x==l->data){
            temp=l;//temp记录前一个元素 
            l=l->next;//如果第一个就是我们要找的元素直接l=l->next; 
            //这里free(temp)不知道应不应该加 
            del(l,x);
            
        }else{
            del(l->next,x);
        }
    }


int main(){
    LinkedList List;
    LinkedList *L=&List;
    buildList(L);
    printf("当前的链表:\n");
    show(L);
    printf("删除后的链表:\n");
    del(L,1);
    show(L);
}

标签:结点,表值,temp,int,next,链表,data,LinkedList
来源: https://blog.csdn.net/Cgxxxxxxxxxxxxxx/article/details/122607958