编写一个程序,要求:从终端输入一组整数(大于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\n*销毁已有链表请输入:2\n*删除已有链表中结点:3\n*已有链表中插入数据:4\n*打印链表请输入:5\n*请输入命令代号以确定执行的操作:"); 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("-----------------------------------------创建成功!\n"); break; } case 3://删除结点操作 if ( m == OK ) { printf("请输入要删除第几个节点:"); int b; scanf("%d",&b); fflush(stdin); deletlinklist(&outlist,b); printf("-----------------------------------------删除成功!\n"); }else { printf("-----------------------------------------当前没有链表,请先创建一个链表!\n"); } break; case 2://销毁链表操作 if (m == OK) { destrylinklist(&outlist); if (outlist == NULL) { printf("-----------------------------------------销毁成功!\n"); m = NO; }else { printf("-----------------------------------------出现错误!\n"); exit(0); } }else { printf("-----------------------------------------当前没有链表可销毁,请先创建一个链表!\n"); } 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("-----------------------------------------插入数据成功!\n"); }else { printf("-----------------------------------------无链表可用,请先创建一个链表!"); } break; case 5://打印链表操作 printf("-----------------------------------------链表打印中...\n-----------------------------------------打印结果为:"); LinkList List = outlist; while (List!=NULL) { printf("%d",List->date); List = List->next; } putchar('\n'); 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
*请输入命令代号以确定执行的操作: