链表的插入_删除

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define true 1
#define false 0
#define OK 1
typedef struct L_list
{
    int data;//数据域
    struct L_list *pNext;

}LIST, *pLIST;
pLIST create_list(int len);//创建一个单链表;
bool Show_list(pLIST pHead);//遍历输出;
bool delete_list(pLIST pHead, int i);//删除第i个位置的元素
bool Insert_list(pLIST pHead, int val, int e);//在第val个位置插入元素,e为要插入的元素;

int main(void)
{
    int len;//len为要生成节点的个数
    int sum;//sum为要删除元素的位置
    int val, e;//val为要插入元素的位置,e为插入到的元素
    pLIST pHead = NULL;
    printf_s("请输入需要生成链表结点的个数");
    scanf_s("%d", &len);

    pHead = create_list(len);
    Show_list(pHead);//遍历输出

    printf("请输入需要删除第几个元素:");
    scanf_s("%d", &sum);
    delete_list(pHead, sum);
    Show_list(pHead);//遍历输出

    printf("请输入需要在第几个位置插入元素几:");
    scanf_s("%d%d", &val, &e);
    Insert_list(pHead, val, e);
    Show_list(pHead);//遍历输出

    return 0;

}
pLIST create_list(int len)//创建一个单链表;
{
    //int leng=len;//存放数据的长度
    int i;
    int val;//用于存放用户临时输入结点的值
    pLIST pTail = (pLIST)malloc(sizeof(LIST));//生成一个头结点
    if (pTail == NULL)
    {
        printf_s("头结点生成失败");
        exit(-1);
    }

    pLIST pLast = pTail;//建立一个临时的点,类似于结点
    pLast->pNext = NULL;//将他的指针域初始化为空

    for (i = 0; i < len; ++i)//给结点的数值域赋值
    {
        printf_s("请输入第%d个结点的值", i + 1);
        scanf_s("%d", &val);//将输入的值临时存放在val中

        pLIST pNew = (pLIST)malloc(sizeof(LIST));//生成一个新结点
        if (pNew == NULL)//判断是否生成成功
        {
            printf("新结点生成失败!");
            exit(-1);
        }
        else
        {
            pNew->data = val;//将输入的值赋值给新节点
            pLast->pNext = pNew;//把链表结点的指针域指向新节点的指针域
            pNew->pNext = NULL;//把新节点的指针域清空
            pLast = pNew;//把新节点的指针域化为尾结点的指针域
        }
    }
    return pTail;//返回头结点
}
bool Show_list(pLIST pHead)//显示输出
{
    pLIST p = pHead->pNext;
    printf("链表的元素为:");
    while (p != NULL)
    {
        printf("%3d", p->data);
        p = p->pNext;

    }
    printf("\n");
    return true;
}
bool delete_list(pLIST pHead, int i)//删除第i个位置的元素
{
    pLIST pLast = pHead;//建立一个临时的点,类似于结点
                        //pLast->pNext = NULL;//将他的指针域初始化为空

    int j = 0;
    if (pHead->data == NULL)
        printf("链表为空,删除失败!");
    else
    {
        while (pHead->pNext&&j < i - 1)//循环找到需要删除的位置
        {
            pHead = pHead->pNext;
            ++j;
        }
        //语文不好,注释不准确请到P30页自己慢慢理解去类似
        pLast = pHead->pNext;//将要删除元素的地址的指针域赋值给plast
        pHead->pNext = pLast->pNext;//将该指针域的指针域赋值给上有一个元素的指针域

        free(pLast);//释放临时存储元素的值,防止内存泄漏
    }
    return true;
}
bool Insert_list(pLIST pHead, int val, int  e)//在第val个位置插入元素;
{
    pLIST p = (pLIST)malloc(sizeof(LIST));//生成一个新的节点
    int j = 0;
    if (pHead->data == NULL)
        printf("链表为空,插入失败!");

    else
    {
        while (pHead->pNext&&j < val - 1)//循环找到需要插入的位置
        {
            pHead = pHead->pNext;
            ++j;
        }
        p->data = e;//将要插入的值给新节点
        p->pNext = pHead->pNext;//将新节点的指针域指向插入位置的下一个节点
        pHead->pNext = p;//将上一个节点的指针域指向他
        return true;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值