#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;
}
}
链表的插入_删除
最新推荐文章于 2022-08-14 18:54:24 发布