数据结构实验报告 链表
来源:互联网 发布:谷歌拼音输入法linux 编辑:程序博客网 时间:2024/05/08 14:40
一、实验目的
(1)掌握线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
(2)掌握线性表的各种操作(建立、插入、删除等)的实现算法;
二、实验仪器及环境:
PC计算机 windows 7操作系统 CodeBlocks10.05
三、实验内容及结果(按照具体实验题目,按照如下格式书写)
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
10.在主函数中设计一个简单的菜单,分别调试上述算法。
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#define MAXASIZE 100typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;} LNode,*LinkList;using namespace std;//1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。LinkList creat()//创建一个带头节点的链表{ printf("Please Input a List of Numbers: "); LinkList p1,p2,head; head=(LNode *)malloc(sizeof(LNode)); head->next=NULL; p1=head; ElemType x; while(scanf("%d",&x)!=-1) { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p1->next=p2; p1=p2; } p1->next=NULL; return head;}//2.遍历单向链表。void display(LinkList head)//遍历{ LinkList p; p=head->next; printf("HEAD -> "); while(p!=NULL) { printf("%d -> ",p->data); p=p->next; } printf("TAIL\n");}void InsertList(LinkList head,ElemType x)//插入x{ //printf("Please Input the Location and the Number which You Want to Insert: "); LinkList l=head,p1,p2; l=head; bool flag=0; if (l->next->data>x)//队首 { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=l->next; l->next=p2; return; } while(l->next) { l=l->next; p1=l; //flag=0;//flag=0表示尚未插入 if (p1->data<=x && p1->next->data>=x)//插入在p1与p1->next中间 { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=p1->next; p1->next=p2; flag=1;//已插入 break; } } if (!flag) { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=NULL; l->next=p2; }}LinkList CreateNew(LinkList head)//构建非递减有序单向链表;{ LinkList l,p1,p2=head; l=(LNode *)malloc(sizeof(LNode)); l->next=NULL; ElemType x; p2=head->next; while(p2) { x=p2->data; p1=(LNode *)malloc(sizeof(LNode)); p1->data=x; p1->next=l->next; l->next=p1; p2=p2->next; } return l;}//3.把单向链表中元素逆置(不允许申请新的结点空间)。LinkList ReverseList(LinkList head)//逆置链表{ LinkList p1,p2; if (head->next==NULL) return head; p1=head->next; head->next=NULL; while(p1) { p2=p1; p1=p1->next; p2->next=head->next; head->next=p2; } return head;}ElemType LengthList(LinkList head){ LinkList p; p=head->next; int num=0; while(p!=NULL) { p=p->next; num++; } return num;}//5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。LinkList SortList(LinkList head)//排序为非减链表{ LinkList p; if (head->next == NULL) return head; int n=LengthList(head); for(int i=1; i<n; i++) { p=head->next; for(int j=0; j<n-1; j++) { if (p->data > p->next->data) { ElemType tmp=p->data; p->data=p->next->data; p->next->data=tmp; } p=p->next; } } return head;}//4.在单向链表中删除所有的偶数元素结点。LinkList DeleteEven(LinkList head)//删除偶数元素节点{ LinkList p1,p2; p1=head; p2=p1->next; while(p1->next) { if ((p2->data & 1)==0) { p1->next=p2->next; free(p2); p2=p1->next; } else { p2=p2->next; p1=p1->next; } } return head;}//7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。void MergeList1(LinkList &head,LinkList &l)//合并两个链表,递增排列{ LinkList p=head; while(p->next!=NULL) { p=p->next; InsertList(l,p->data); } CreateNew(l);}//6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。void MergeList2(LinkList &head,LinkList &l)//合并两个链表,递减排列{ LinkList p=head; while(p->next!=NULL) { p=p->next; InsertList(l,p->data); } CreateNew(l); ReverseList(l);}//8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)void divide(LinkList head)//分为左右两部分,左边的元素为奇数,右边所有元素为偶数{ LinkList L=head,p,q,r,s; r=L; p=L->next; int j=0; while(p!=NULL) { s=p;//s为最后一个节点; p=p->next; j++; } r=L; p=L->next; q=p->next; for(int i=0; i<j-1; i++) { if((p->data)%2==0) { r->next=q; p->next=NULL; s->next=p; s=p; p=q; q=p->next; } else { r=p; p=q; q=p->next; } }}void depart(LinkList head,LinkList l){ LinkList q=head,p; q=q->next; while(q->data%2==1) { ElemType x; x=q->data; p=(LinkList)malloc(sizeof(LNode)); p->data=x; p->next=l->next; l->next=p; head->next=q->next; free(q); q=head->next; }}void freelist(LinkList head)//释放链表空间{ LinkList l=head; LinkList q; while(l) { q=l; l=l->next; free(q); }}void swap(LinkList head)//交换值的排序{ LinkList l=head,p,q; p=l->next; int j=0; while(p) { p=p->next; j++; } for(int i=0; i<j; i++) { q=l->next; for(int k=i; k<j-1; k++) { p=q; q=p->next; if(p->data > q->data) { int tmp; tmp=p->data; p->data=q->data; q->data=tmp; } } }}int main(){ LinkList head=creat();//显示 display(head);//排序 LinkList head2=SortList(head); display(head2);//合并链表1 MergeList1(head,head2);//合并链表2 MergeList2(head,head2); display(head2);//链表插入元素 int tt; scanf("%d",&tt); InsertList(head,tt); display(head);//逆置链表 ReverseList(head); display(head);//删除偶数元素 DeleteEven(head); display(head);//按奇偶分解链表 divide(head); LinkList l; l=(LinkList)malloc(sizeof(LNode)); l->next=NULL; depart(head,l); display(head); display(l); return 0;}
0 0
- 数据结构实验报告 链表
- 《数据结构》实验一 实验报告
- 数据结构 实验一实验报告
- 数据结构实验一 实验报告
- 实验报告--数据结构实验一
- 数据结构实验一(实验报告)
- 《数据结构实验一》实验报告
- 《数据结构》实验报告
- 《数据结构》实验报告
- 数据结构实验报告一
- 《数据结构》实验报告
- 数据结构实验报告1
- 数据结构实验报告2
- 数据结构实验报告
- 数据结构-队列实验报告
- 数据结构实验报告
- 数据结构课程设计实验报告
- 数据结构实验报告第一个
- Mybatis最入门---HelloWorld
- Bitmap的简单特效处理
- 蓝桥杯+大臣的旅费
- NSCountedSet
- ASP.NET C# MD5加密
- 数据结构实验报告 链表
- Transaction not successfully started
- diff命令输出格式解读
- hibernate映射关系
- 二级指针的作用详解
- Android GoogleMap suggestion AutoComplete (二)具体实现
- 理解进程调度时机跟踪分析进程调度与进程切换的过程
- Java的语言基础
- AbsListView 浅析