链表的插入_删除

来源:互联网 发布:淘宝的购物评级怎么涨 编辑:程序博客网 时间:2024/06/05 11:13
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define true 1#define false 0#define OK 1typedef 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;    }}
原创粉丝点击