单链表基本操作实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验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
#include
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 { 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 { 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 { 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指向待处理的结点