编写一个程序,要求:从终端输入一组整数(大于10个数),以0作为结束标志,将这一组整数,存放在一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表;
程序清单:
#include<stdio.h>
#include<stdlib.h>
/*****************************************************************
* 把一组数(大于10个)存到一个链表中,以0为结束标志,链表里不包含0
* 打印链表中的值
* 删除该链表中的而第五个元素
* 打印删除后的结果
* 销毁链表
*****************************************************************/
typedef struct Node
{
int date;
struct Node *next;
}Node , *LinkList;
/////////////////////////////////////////////////////////////////
//创建一个链表
LinkList creatlinklist(int n)
{
LinkList New_node , Tail_node;
LinkList Head_node = NULL;
int c;
for (size_t i = 1; i < n; i++)
{
printf("请输入第%d个节点存入的数据:",i);
scanf("%d",&c);
if (c!=0)
{
New_node = (LinkList)malloc(sizeof(Node));
New_node->date = c;
New_node->next = NULL;
if (Head_node==NULL)
{
Head_node = New_node;
}else
{
Tail_node->next = New_node;
}
Tail_node = New_node;
}else
{//如果输入中出现0,结束链表的数据读取
return Head_node;
}
}
return Head_node;
}
////////////////////////////////////////////////////////////////////
//删除链表中的某个元素
void deletlinklist(LinkList *List , int n)
{
LinkList dele_node = *List;
for (size_t i = 1; i <n; i++)
{
dele_node = dele_node->next;
}
if (n==1)
{
*List = dele_node->next;
free(dele_node);
}else
{
LinkList befor_node = *List;
for (size_t i = 1; i < n-1; i++)
{
befor_node = befor_node->next;
}
befor_node->next = dele_node->next;
free(dele_node);
}
}
/////////////////////////////////////////////////////////////////////
//链表中插入元素
void insertlinklist(LinkList *List , int m , int date)
{
LinkList insert_node , befor_node;
insert_node = (LinkList)malloc(sizeof(Node));
insert_node->date = date;
insert_node->next = NULL;
if (m!=1)
{
befor_node = *List;
for (size_t i = 1; i <= m-1; i++)
{
befor_node = befor_node->next;
}
insert_node->next = befor_node->next;
befor_node->next = insert_node;
}else
{
*List = insert_node;
}
}
/////////////////////////////////////////////////////////////////////
//销毁链表
void destrylinklist(LinkList *List)
{
LinkList p,q;
p = *List;
while (p)
{
q = p->next;
free(p);
p = q;
}
*List = NULL;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#define OK 1
#define NO 0
int main()
{
/////////////////////////////
//引导
int i;//命令字符
int m = NO;//判断是否创建了链表
LinkList outlist;
while (1!=0)
{
printf("*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:");
scanf("%d",&i);
fflush(stdin);
switch (i)
{
case 1://创建列表操作
{
LinkList L;
printf("请输入新建链表的最大结点个数(最好大于10个):");
int n;
scanf("%d",&n);
fflush(stdin);
L = creatlinklist(n);
m = OK;
outlist = L;
printf("-----------------------------------------创建成功!
");
break;
}
case 3://删除结点操作
if ( m == OK )
{
printf("请输入要删除第几个节点:");
int b;
scanf("%d",&b);
fflush(stdin);
deletlinklist(&outlist,b);
printf("-----------------------------------------删除成功!
");
}else
{
printf("-----------------------------------------当前没有链表,请先创建一个链表!
");
}
break;
case 2://销毁链表操作
if (m == OK)
{
destrylinklist(&outlist);
if (outlist == NULL)
{
printf("-----------------------------------------销毁成功!
");
m = NO;
}else
{
printf("-----------------------------------------出现错误!
");
exit(0);
}
}else
{
printf("-----------------------------------------当前没有链表可销毁,请先创建一个链表!
");
}
break;
case 4://插入结点操作
if (m==OK)
{
printf("请输入要在第几个节点后插入数据:");
int a;
scanf("%d",&a);
fflush(stdin);
printf("请输入要插入的数据:");
int j;
scanf("%d",&j);
insertlinklist(&outlist , a , j);
printf("-----------------------------------------插入数据成功!
");
}else
{
printf("-----------------------------------------无链表可用,请先创建一个链表!");
}
break;
case 5://打印链表操作
printf("-----------------------------------------链表打印中...
-----------------------------------------打印结果为:");
LinkList List = outlist;
while (List!=NULL)
{
printf("%d",List->date);
List = List->next;
}
putchar('
');
break;
default:
break;
}
}
return 0;
}
运行结果:
$ 实例1-3.exe
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:1
请输入新建链表的最大结点个数(最好大于10个):15
请输入第1个节点存入的数据:1
请输入第2个节点存入的数据:2
请输入第3个节点存入的数据:3
请输入第4个节点存入的数据:4
请输入第5个节点存入的数据:5
请输入第6个节点存入的数据:6
请输入第7个节点存入的数据:7
请输入第8个节点存入的数据:8
请输入第9个节点存入的数据:0
-----------------------------------------创建成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:12345678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:3
请输入要删除第几个节点:3
-----------------------------------------删除成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:1245678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:4
请输入要在第几个节点后插入数据:2
请输入要插入的数据:3
-----------------------------------------插入数据成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:12345678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:2
-----------------------------------------销毁成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作: