单链表——头插法、尾插法和查找

#include<stdio.h>

#include<malloc.h>

#define OK 1

#define ERROR 0



typedef struct Node

{

    int date;

    struct Node * next;

}Node, *LinkList;



void InitList(LinkList *L)//初始化单链表

{

    *L=(LinkList)malloc(sizeof(Node));

    (*L)->next=NULL;

}



void Output(LinkList L)

{

    Node *p;

    p=L->next;

    printf("现在链表的内容是:\n");

    while(p!=NULL)

    {

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

        p=p->next;

    }

    printf("\n");

}



void CreateFormHead(LinkList L)//头插法创建单链表LA,输入-1结束

{

    Node *s;

    int c;

    int flag=1;

    while(flag)

    {

        scanf("%d",&c);

        if(c!=-1)

            {

                s=(Node *)malloc(sizeof(Node));

                s->date=c;

                s->next=L->next;

                L->next=s;

            }

        else flag=0;

    }

}



void CreateFormTail(LinkList LB)//尾插法创建单链表LB,输入-1结束

{

    Node *r,*s;

    int c;

    int flag=1;

    r=LB;

    while(flag)

    {

        scanf("%d",&c);

        if(c!=-1)
        {

            s=(Node *)malloc(sizeof(Node));

            s->date=c;

            r->next=s;

            r=s;

        }

        else
        {

            flag=0;

            r->next=NULL;

        }

    }

}



void Get(LinkList L,int i)//按序号查找LA

{

    int j=0;

    Node *p;

    if(i<=0) printf("找不到!\n");

    p=L;

    while((p->next!=NULL)&&(j<i))

    {

        p=p->next;

        j++;

    }

    if(i==j) printf("找到的内容是:%d\n",p->date);

    else printf("找不到!\n");

}



void Locate(LinkList L,char key)//按内容查找LA

{

    int i=1;
    
    Node *p;

    p=L->next;

    while(p!=NULL)

    {

        if(p->date!=key)

        {
            p=p->next;

            i++;

        }

        else break;
    }

     if(p!=NULL)

         printf("找到的序号是:%d\n",i);

    else printf("找不到!\n");

}



void InsList(LinkList LA,int i,int e)//插入操作

{
    
    Node *pre,*s;

    int k;

    if(i<=0) printf("插入位置不合法!\n");

    pre=LA;

    k=0;

    while(pre!=NULL&&k<i-1)

    {

        pre=pre->next;

        k=k+1;

    }

    if(pre==NULL)

    {

        printf("插入位置不合法!\n");

    }

    s=(Node*)malloc(sizeof(Node));

    s->date=e;

    s->next=pre->next;

    pre->next=s;

    printf("插入成功!\n");

}



int DelList(LinkList LA,int i,int *e)//删除操作

{

    Node *pre,*r;

    int k;

    pre=LA;

    k=0;

    while(pre->next!=NULL&&k<i-1)

    {

        pre=pre->next;

        k=k+1;

    }

    if(pre->next==NULL)

    {

        printf("删除位置不合法!\n");

        return ERROR;

    }

    r=pre->next;

    pre->next=r->next;

    *e=r->date;

    free(r);

    return OK;

}



int main()

{

    int i;//序号

    LinkList LA;

    LinkList LB;



    InitList(&LA);

    printf("(头插法)输入单链表LA,输入-1结束:");

    CreateFormHead(LA);

    Output(LA);



    InitList(&LB);

    printf("(尾插法)输入单链表LB,输入-1结束:");

    CreateFormTail(LB);

    Output(LB);


    printf("输入查找LA节点的序号:");

    scanf("%d",&i);

    Get(LA,i);//按序号查找



    int k;

    printf("输入查找LA节点的内容:");

    scanf("%d",&k);

    Locate(LA,k);//按内容查找



    int e1;

    printf("输入插入LA节点的序号:");

    scanf("%d",&i);

    printf("输入插入LA节点的内容:");

    scanf("%d",&e1);

    InsList(LA,i,e1);//单链表插入操作

    Output(LA);



    int e2;

    printf("输入删除LA节点的序号:");
    
    scanf("%d",&i);

    if(DelList(LA,i,&e2))

    printf("删除的元素是:%d\n",e2);

    Output(LA);



    return 0;

}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值