链表的定义和运算

实验内容

1.单链表的存储结构定义。

2.从键盘上依次输入21、18、30、75、42、56,逆序创建单链表(前插法),并输出单链表中的各元素值。

3.分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。

4.删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。

#include<stdio.h>

#include<malloc.h>

#define ERROR 0

typedef struct LNode//单链表的存储定义

{

    int data;

    struct LNode *next;

}LNode,*LinkList;

LinkList lnitList(LinkList L)//初始化链表

{

    LinkList node=NULL;

    node=(LinkList)malloc(sizeof(LNode));

    if(!node)

    {

        return ERROR;

    }

    node->next=NULL;

    L=node;

    return L;

}

int ListLength(LinkList L)//链表长度

{

    LinkList p=NULL;

    int count=0;

    p=L;

    while(p->next)

    {

        count++;

        p=p->next;

    }

    return count;

}

LinkList CreateList_L(LinkList L,int n)//创建单链表

{

    int i;

    LinkList p=NULL;

    for(i=n;i>0;i--)

    {

        p=(LinkList)malloc(sizeof(LNode));

        scanf("%d",&p->data);

        p->next=L->next;

        L->next=p;

    }

    return L;

}

LinkList Listlnsert(LinkList L,int i,int e)//插入

{

    int j=0;

    LinkList s=NULL,p=NULL;

    p=L;

    while(p&&j<i-1)

    {

        p=p->next;

        j++;

    }

    if(!p||j>i-1)

    {

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

        return L;

    }

    s=(LinkList)malloc(sizeof(LNode));

    s->data=e;

    s->next=p->next;

    p->next=s;

    return L;

}

LinkList ListDelete(LinkList L,int i)//单链表的删除

{

    int j;

    LinkList q=NULL,p=NULL;

    p=L;

    j=0;

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

    {

        p=p->next;

        j++;

    }

    if(!p->next||j>i-1)

    {

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

        return L;

    }

    q=p->next;

    p->next=q->next;

    free(q);

    return L;

}

int GetElem(LinkList L,int i)//单链表的取值

{

    int j,e;

    LinkList p=NULL;

    if(i<1||i>ListLength(L))

    {

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

        return ERROR;

    }

    p=L->next;

    j=1;

    while(j<i)

    {

        p=p->next;

        j++;

    }

    e=p->data;

    printf("%d位的数据元素为%d\n",i,e);

    return e;

}

void menu()//菜单

{

    printf("1、输入单链表中的各元素值\n");

    printf("2、在单链表中插入数据元素\n");

    printf("3、在单链表中删除数据元素\n");

    printf("4、结束程序\n");

    printf("------------\n");

}

int main()

{

    int n,m,i,e;

    LinkList L=NULL,p=NULL;

    L=lnitList(L);

    printf("请输入元素个数:");

    scanf("%d",&n);

    printf("依次输入%d个数数据元素:",n);

    L=CreateList_L(L,n);

    do

    {

        printf("\n\n");

        menu();

        printf("请输入你的选择:");

        scanf("%d",&m);

        switch(m)

        {

        case 1:

            printf("现在链表的元素为:");

            p=L->next;

            while(p!=NULL)

            {

                printf("%d,",p->data);

                p=p->next;

            }

            printf("\n");

            break;

        case 2:

            printf("依次输入插入位置和数据元素:");

                scanf("%d%d",&i,&e);

            L=Listlnsert(L,i,e);

            break;

        case 3:

            printf ("输入需要删除的元素位置的:");

            scanf("%d",&i);

            L=ListDelete(L,i);

            break;

        case 0:

            printf("已结束程序!!!\n");

                break;

        default:

            printf("输入错误!!!\n");

        }

    }while(m!=0);

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值