单链表的增删改查功能实现C语言代码

时间:2022-04-24 00:24:17
上一篇博客写了单链表的创建(头插法,尾插法)现在写数据结构的增删改查

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef int  ELem;

typedef struct Node

{

    int date;

    struct Node *next;

}Node;

typedef  struct Node *Linklist;

void chuangjian(Linklist *L,int n)

{

    Linklist p,t;//声明结点

    *L=(Linklist)malloc(sizeof(Node));//生成新结点

    (*L)->next=NULL;//新结点指向空结点

    t=(*L);//中间值

    for(int i=0;i<n;i++)

    {

/*//头插法

 p=(Linklist)malloc(sizeof(Linklist));//生成新结点p

        scanf("%d",&(p->date));//为新结点的date域赋值

        p->next=(*L)->next;//p的后继指向(*L)的后继

        (*L)->next=p;*///插入到表头

//尾插法

    p=(Linklist)malloc(sizeof(Node));//生成新结点p

        p->next=NULL;//p结点的后继为空

        scanf("%d",&(p->date));//赋值操作

        t->next = p;//将表尾终端结点的指针指向新结点

        t = p;//将当前结点定义为表尾终端节点

    }

}

void Tiqu(Linklist L,int i,int *e)

{

    int j=1;

    Linklist p;

    p=L->next;

    while (p&&j<i) {

        p=p->next;

        ++j;

    }

        *e =p->date;

}

void shanchu(Linklist *L,int i,int *e)

{

    int j=1;

    Linklist p,q;

    p=*L;

    while (p->next&&j<i) {

        p=p->next;

        ++j;

    }

    q=p->next;

    *e=q->date;

    p->next=p->next->next;

    free(q);

}

void genggai(Linklist *L,int i,int e)

{

    int j=1;

    Linklist p;

    p=*L;

    while (p&&j<i) {

        p=p->next;

        j++;

    }

    p->next->date=e;

}

void zengjia(Linklist *L,int i,int x)

{int j=1;

    Linklist p,q;

    p=*L;

    q=(Linklist)malloc(sizeof(Linklist));

    q->next=NULL;

    q->date=x;

    while (p->next&&j<i) {

        p=p->next;

        j++;

    }

    q->next=p->next;

    p->next=q;

}

int main(int argc, const char * argv[]) {

    Linklist l,s,p,h;

    int a,i,j,q,w,e,r;

    printf("请输入要输入多少个数据");

    scanf("%d",&a);

    chuangjian(&l, a);

    p=l;

    s=l;

    h=l;

    while (l->next!=NULL)

    {

        l=l->next;

        printf("%d\t",l->date);

    }

    printf("请输入要查找第几个数据\n");

    scanf("%d",&i);

    Tiqu(p,i,&i);

    printf("要查找的数据为");

    printf("%d\t",i);

    printf("\n");

    printf("请输入要删除第几个数据");

    scanf("%d",&j);

    shanchu(&p,j,&j);

    printf("删除后的链表为");

    while (p->next != NULL)

    {

        p = p->next;

        printf("%d\t",p->date);

    }

    printf("\n");

    printf("删除的数据是");

    printf("%d\n",j);

    printf("修改第几个位置\n");

    scanf("%d",&q);

    printf("修改为多少\n");

    scanf("%d",&w);

    genggai(&s,q,w);

      printf("更改获得的链表为\n");

    while (s->next != NULL)

    {

        s = s->next;

        printf("%d\t",s->date);

    }

    printf("\n");

    printf("添加的位置\n");

    scanf("%d",&e);

    printf("添加数据为多少\n");

    scanf("%d",&r);

    zengjia(&h,e,r);

    while (h->next != NULL)

    {

        h = h->next;

        printf("%d\t",h->date);

    }

    return 0;

}