实验2 链表的操作实验容:1)基础题:编写链表基本操作函数,链表带有头结点(1)CreatList_h()//用头插法建立链表(2)CreateList_t()//用尾插法建立链表(3)InsertList()向链表的指定位置插入元素(4)DeleteList()删除链表中指定元素值(5)FindList()查找链表中的元素(6)OutputList()输出链表中元素2)提高题:(1)将一个头节点指针为heada的单链表A分解成两个单链表A和B,其头结点指针分别为heada和headb,使得A表中含有原单链表A中序号为奇数的元素,B表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
(2)将一个单链表就地逆置。
即原表(a1,a2,。
an),逆置后新表(an,an-1,。
a1)/*程序功能 :单链表基本功能操作编程者 :天啸日期 :2016-04-14版本号 :3.0*/#include <stdio.h>#include <stdlib.h>typedef struct List{int data;struct List *next;}List;void CreatList_h(List *L) //头插法{int i = 0;int n = 0;int goal;List *p;printf("请输入数据的个数:\n");scanf("%d",&n);L -> next = NULL;for(i=0;i<n;i++){printf("请输入第%d个数:\n",i+1);scanf("%d",&goal);p = (struct List*)malloc(sizeof(struct List));p -> data = goal;p -> next = L->next; //将L指向的地址赋值给p;L -> next = p;}}void CreateList_t(List *L) //尾插法{int i;int n;int goal;List *p;List *q=L;printf("请输入数据的个数:\n");scanf("%d",&n);for (i=0;i<n;i++){printf("请输入第%d个数:\n",i+1);scanf("%d",&goal);p = (struct List*)malloc(sizeof(struct List));p -> data = goal;q -> next = p;q = p;}q -> next = NULL;}void InsList(List *L,int i,int e) //插入{List *s;List *p = L;int j = 0;while (p&&j<i-1){p = p->next;++j;}s = (struct List*)malloc(sizeof(struct List));s -> data = e; //插入L中s -> next = p -> next;p -> next = s;return ;}void DeleteList(List*L,int e) //删除{List *q;List *p = L;while (p->next&&p->next->data!=e){p = p -> next;}if (!(p->next)){printf("不存在该元素!\n");exit(0);}q = p -> next;p -> next = q->next;e = q -> data;free(q);return ;}void FindList(List*L,int e) //查找元素{int j = 1;List *p = L->next;while (p&&p->data!=e){p = p->next;++j;}if (!p){printf("不存在该元素!\n");exit(0);}printf("您查找的元素位置为:%d\n",j);return ;}void DisPlay(List *L) //输出链表{List *p = L->next;printf("您输入的数据为:\n");while (p!=NULL){printf ("%d ",p->data);p = p -> next;}printf("\n");}void Inverse(List*L) //单链表就地逆置{List *q;List *p = L->next;L -> next = NULL;while (p != NULL){q = p -> next; //q指针保留原链表当前处理节点的下一个节点p -> next = L -> next; //将当前处理节点p插入到逆置L的表头L -> next = p;p = q; //p指向下一个待插入的节点}}void DisCreat(List*L) //链表拆分{int i = 0; //i记录表A中结点的序号List *p;List *B = (struct List*)malloc(sizeof(struct List)); //创建 B 表表头B -> next = NULL; //B表初始化List*ra = L,*rb = B; //ra和rb将分别指向将创建的A 表和B表的尾结点p = L -> next; //p指向待处理的结点L -> next = NULL; //置空新的 A 表 while (p != NULL){i++; //序号加 1if (i%2 == 0){ //处理序号为偶数的链表结点rb -> next = p; // 若B表尾描入新结点rb = p; //rb指向新的尾结点}else{ //处理原序号为奇数的结点ra -> next = p; //在A表尾插入新结点ra = p;}p = p->next; //将p指向新的待处理结点}ra -> next = NULL;rb -> next = NULL;p = L -> next;printf("奇数位数据为:\n"); //输出奇数位数据while (p != NULL){printf ("%d ",p -> data);p = p -> next;}printf("\n");List *q = B->next;printf("偶数位数据为:\n"); //输出偶数位数据while(q != NULL){printf ("%d ",q->data);q = q -> next;}printf("\n");return ;}int main(){int n;int i;int e;int No;List*L = (struct List*)malloc(sizeof(struct List));List*B = (struct List*)malloc(sizeof(struct List));char yes_no = 'y';while(yes_no=='y'||yes_no=='Y') //循坏开始{system("cls");printf("\t\t\t|---------------------------------|\n"); //交互式界面printf("\t\t\t| 单链表基本操作 |\n");printf("\t\t\t|---------------------------------|\n");printf("\t\t\t| 1---头插法建立链表 |\n");printf("\t\t\t| 2---尾差法建立链表 |\n");printf("\t\t\t| 3---指定位置插入 |\n");printf("\t\t\t| 4---指定元素删除 |\n");printf("\t\t\t| 5---查找链表元素 |\n");printf("\t\t\t| 6---输出链表元素 |\n");printf("\t\t\t| 7---单链表就地逆置 |\n");printf("\t\t\t| 8---单链表拆分 |\n");printf("\t\t\t| 0---退出 |\n");printf("\t\t\t|---------------------------------|\n");printf("\t\t\t| 计科14-2 第5组^_^|\n");printf("\t\t\t|---------------------------------|\n");printf("请选择运算方式:\n");scanf ("%d",&No);switch(No){case 1:{CreatList_h(L);DisPlay(L);break;}case 2:{CreateList_t(L);DisPlay(L);break;}case 3:{printf("请输入需要插入元素的位置:\n");scanf("%d",&i);printf("请输入需要插入的元素:\n");scanf("%d",&e);InsList(L,i,e);DisPlay(L);break;}case 4:{printf("请输入需要删除的元素:\n");scanf("%d",&e);DeleteList(L,e);DisPlay(L);break;}case 5:{printf("请输入需要查找的元素:\n");scanf("%d",&e);FindList(L,e);DisPlay(L);break;}case 6:{DisPlay(L);break;}case 7:{Inverse(L);DisPlay(L);break;}case 8:{DisCreat(L);break;}case 0:system("cls");printf("\n\n\n\t\t\t尚有很多不足之处,望多多指教!");exit(0);break;default:printf(" 请输入正确的数字。