数据结构链表的逆序创建,插入,删除——个人学习

数据结构链表的逆序创建,插入,删除——个人学习

运行展示

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0

typedef int Elemtype;
typedef int status;

//定义链表的结点和指针类型
typedef  struct  Lnode {
    Elemtype  data;    // 数据域
    struct   Lnode* next;   // 指针域
}Lnode, * linklist;//LNode 是一个结构体类型。 LinkList 是一个结构体的指针类型

//逆序建立带表头结点的单链表
linklist CreateList_L(linklist& L)
{
    linklist p;
    int n;
    L = (linklist)malloc(sizeof(Lnode));
    L->next = NULL;//先建立一个带头结点的单链表
    printf("请输入将要载入链表的元素个数:");
    scanf_s("%d", &n); //初始化线性链表元素的个数
    getchar(); //清除回车符
    printf("请逆序输入%d个元素的值:\n", n);
    for (int i = n; i > 0;i--)//逆位序(插在表头)输入n个元素的值
    {
        p = (linklist)malloc(sizeof(Lnode)); //生成新结点
        scanf_s("%d", &p->data);
        p->next = L->next; //插入表头
        L->next = p;
    }
    printf("逆序建立带表头结点的单链表完成!\n\n");
    printf("请选择您的下一步操作:");
    return L;
}

//遍历输出并输出长度
status VisitList(linklist& L)
{
    linklist p;
    int i = 1;
    p = L->next;
    if (L->next == NULL)
        return ERROR;
    printf("输出单链表:\n");
    while (p->next != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
        i++;
    }
    printf("%d\n", p->data);
    printf("链表长度为:%d\n", i);
    printf("计算链表长度并输出单链表完成!\n\n");
    printf("请选择您的下一步操作:");
    return OK;
}

//节点插入
status ListInsert_L(linklist& L)
{
    int i;
    printf("请您选择在那个元素之前插入:");
    scanf_s("%d", &i);
    Elemtype e;
    linklist p = L, s;
    int j = 0;
    while (p && j < i - 1)	//寻找第i-1个结点
    {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1) return ERROR; //插入位置不合理 !p代表p = NULL 即p所指向的结点不存在 ; j>i - 1代表非第i元素之前节点。
    printf("您选择插入的数值为:");
    scanf_s("%d",&e);
    s = (linklist)malloc(sizeof(Lnode));    //生成新结点
    s->data = e;//将节点s的data值设置为e
    s->next = p->next;//链表指针的赋值,将p的下一个节点的位置付给了s的下一个节点
    p->next = s;   //实现插入,把s接到p的下一个节点上
    printf("插入完成!\n\n");
    printf("请选择您的下一步操作:");
    return OK;
}

// 删除节点值为x的结点
status ListDelete_L(linklist& L)
{
    Elemtype x;
    printf("请您输入需要删除节点的值x: ");
    scanf_s("%d", &x);
    getchar();//清除回车符
    linklist p = L, q;
    while (p->next && p->next->data != x)
        //寻找第i个结点,并令p指向其前趋
    {
        p = p->next;
    }
    if (!(p->next)) return ERROR;  //删除位置不合理
    q = p->next; //临时保存被删结点的地址以备释放
    p->next = q->next;//改变删除结点前驱结点的指针域 
    //相当于p->next = p->next->next
    free(q);//释放删除结点的空间 
    printf("删除操作完成!\n\n");
    printf("请选择您的下一步操作:");
    return OK;
}

//主函数
void main()
{
    linklist L1;
    printf("\n\n");
    printf(" ——————请您按提示操作Linklist——————\n");
    printf("|| 按(1)建立带头节点的单链表      ||\n");
    printf("|| 按(2)插入节点                 ||\n");
    printf("|| 按(3)计算链表长度并输出单链表  ||\n");
    printf("|| 按(4)删除节点值为x的结点       ||\n");
    printf("|| 按(0)退出系统            	  ||\n");
    printf(" ——————————————————————————————————\n");
    int choice;
    printf(" 请输入选择:");
    while (scanf_s("%d", &choice))
    {
        getchar();
        printf("\n");
        switch (choice)
        {
        case 1:
            CreateList_L(L1);
            break;
        case 2:
            ListInsert_L(L1);
            break;
        case 3:
            VisitList(L1);
            break;
        case 4:
            ListDelete_L(L1);
            break;
        case 0:exit(0); //退出系统  
        default:
            printf(" Input error!");
            break;
        }
    }
}
## 如果对您有帮助请关注我,或者我自己学习用的微信公众号:星谐!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星谐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值