编辑代码

#include <stdio.h>
typedef struct Link{
    int elem;
    struct Link * next;
}link;
// 创建一个存储{1,2,3,4}且有头节点的链表
link * initLink(){
    link * p = (link*)malloc(sizeof(link));// 创建头节点
    // 首元节点初始化
    link * temp = p;//声明一个指针指向头结点,用于遍历链表
    //从第二个节点开始创建
    for(int i = 1; i<5; i++){
        //创建一个新节点并初始化
        link  *a = (link*)malloc(sizeof(link));
        a -> elem = i;
        a -> next = NULL;
        //建立新节点与直接前驱结点的逻辑关系
        temp->next = a;
        temp = temp -> next;
    }
    return p;
}
void display(link *p){
    link *temp = p;//将temp指针重新指向头节点
    //只要temp指针指向的结点的next不是null,就执行输出语句
    while(temp->next){
        temp = temp -> next;
        printf("%d ", temp -> elem);
    }
    printf("\n");
}
//p为原链表,elem表示新数据元素,add表示新元素要插入的位置
link * insertElem(link *p, int elem, int add){
    link *temp = p;//将temp指针重新指向头节点
    //首先找到要插入位置的上一个结点
    for(int i=1;i<add;i++){
        temp = temp->next;
        if(temp == NULL){
            printf("插入位置无效\n");
            return p;
        }
    }
    // 创建插入结点c
    link *c = (link*)malloc(sizeof(link));
    c->elem = elem;
    //向链表中插入结点
    c->next = temp->next;
    temp -> next = c;
    return p;
}
//查找元素
link * selectElem(link *p, int elem){
    //新建一个指针t,初始化为头指针 p
    link * t = p;
    //由于头结点的存在
    while(t->next){
        t = t->next;
        if(t->elem == elem){
            return t;
        }
    }
    return NULL;
}
//查找上一个结点
link * selectLast(link *p, link * temp){
    //新建一个指针t,初始化为头指针 p
    link * t = p;
    //由于头结点的存在
    while(t->next){
        t = t->next;
        if(t->next == temp){
            return t;
        }
    }
    return NULL;
}
//add是要删除的元素
link * delElem(link *p, int del){
    
    //遍历到被删除的结点
    link *temp = selectElem(p,del);
    // 遍历到被删除结点的上一个结点
    link *last = selectLast(p,temp);
    last -> next = last -> next -> next;//删除该结点
    free(temp); //手动释放该节点,防止内存泄漏
    return p;
}

// 链表更新元素
link *updateElem(link *p, int add, int newElem){
    link * temp = selectElem(p,add);
    temp -> elem = newElem;
    return p;
}
int main () {
    link *p = initLink();
    display(p);
    p = insertElem(p,5,4);
    display(p);
    //p=delElem(p,5);
    //display(p);
    //link * find = selectElem(p,5);
    //printf("%d ", find->elem);
    //p=updateElem(p,5,6);
    //display(p);
    p = delElem(p,5);
    display(p);
    return 0;
}