实验学时 2学时
背景知识:顺序表、链表的插入、删除及应用。
目的要求:
(1)掌握线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
(2)掌握线性表的各种操作(建立、插入、删除等)的实现算法;
实验内容:
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
* 9.采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。
10.在主函数中设计一个简单的菜单,分别调试上述算法。
*11.综合训练:利用链表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等,并能够实现将数据存储到文件中)
实验说明
1.算法1至算法7可以以头文件的方式存储,主函数实现该头文件的包含即可调用
2.存储定义
#define MAXSIZE 100 //表中元素的最大个数
typedef int ElemType;//元素类型
typedef struct list{
ElemType elem[MAXSIZE];//静态线性表
int length; //表的实际长度
}SqList;//顺序表的类型名
3.建立顺序表时可利用随机函数自动产生数据。
实验说明
1.类型定义
#include <stdio.h>
typedef int ElemType;//元素类型
typedef struct LNode
{ElemType data;
struct LNode *next;
}LNode,*LinkList;
2.为了算法实现简单,最好采用带头结点的单向链表。
注意问题
1.重点理解链式存储的特点及指针的含义。
2.注意比较顺序存储与链式存储的各自特点。
3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
4.单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode *next;
} LNode,*Linklist;
void creat(Linklist &L)
{
ElemType x;
Linklist p,q;
L=new LNode;
q=L;
cout<<"pleas enter x:";
cin>>x;
while(x!=-999)
{
p=new LNode;
p->data=x;
q->next=p;
q=p;
cout<<"pleas enter x:";
cin>>x;
}
p->next=NULL;
}
void display(Linklist L)
{
Linklist p;
p=L->next;
cout<<endl;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void reverse(Linklist &L)
{
Linklist p,q,tmp;
p=L;
q=L->next;
p=NULL;
while(q!=NULL)
{
tmp=q->next;
q->next=p;
p=q;
q=tmp;
}
q=new LNode;
q->next=p;
L=q;
}
void deleven(Linklist &L)
{
Linklist p;
p=L->next;
if(p->data%2==0)
L->next=p->next;
while(p->next!=NULL)
{
if(p->next->data%2==0)
{
p->next=p->next->next;
}
p=p->next;
}
}
void insert(Linklist &L,Linklist &q)
{
Linklist p;
p=L->next;
if(p==NULL)
{
L->next=q;
return;
}
int flag=0;
while(p->next!=NULL)
{
if(q->data>=p->data&&q->data<=p->next->data)
{
q->next=p->next;
p->next=q;
flag=1;
return;
}
p=p->next;
}
if(flag==0)
{
if(q->data>=p->data)
{
p->next=q;
q->next=NULL;
}
else
{
p=L->next;
L->next=q;
q->next=p;
}
}
return;
}
void creat2(Linklist &L)
{
ElemType x;
Linklist p;
L=new LNode;
L->next=NULL;
cout<<"pleas enter x:";
cin>>x;
while(x!=-999)
{
p=new LNode;
p->data=x;
p->next=NULL;
insert(L,p);
//display(L);
cout<<"pleas enter x:";
cin>>x;
}
}
void merge(Linklist &A,Linklist &B)
{
Linklist p,q;
p=B->next;
while(p!=NULL)
{
q=new LNode;
q->data=p->data;
insert(A,q);
p=p->next;
}
}
void divide(Linklist &L)
{
Linklist A=L;
Linklist B=new LNode;
Linklist p=L->next,a=A,b=B;
while(p!=NULL)
{
if(p->data%2==1)
{
a->next=p;
a=a->next;
}
else
{
b->next=p;
b=b->next;
}
p=p->next;
}
a->next=NULL;
b->next=NULL;
display(A);
display(B);
}
int main()
{
printf("创建链表请输入1(输入值为-999时停止)\n");
printf("历遍链表并输出元素输入2\n");
printf("元素逆序请输入3\n");
printf("删除所有的偶数元素结点输入4\n");
printf("在已知非递减有序链表中插入一个元素输入5\n");
printf("创建一个非递减有序单向链表输入6\n");
printf("创建两个非递减链表并合并成非递增链表输入7\n");
printf("创建两个非递减链表并合并成非递减链表输入8\n");
printf("创建一个链表并将其分成奇数和偶数两个链表输入9\n");
printf("菜单提示输入10\n");
printf("退出输入11\n");
Linklist L;
while(1)
{
int num;
printf("请输入功能:");
scanf("%d",&num);
switch(num)
{
case 1:
{
creat(L);
break;
}
case 2:
{
display(L);
break;
}
case 3:
{
reverse(L);
display(L);
break;
}
case 4:
{
deleven(L);
display(L);
break;
}
case 5:
{
int x;
printf("输入一个新元素:");
scanf("%d",&x);
Linklist p=new LNode;
p->data=x;
p->next=NULL;
insert(L,p);
display(L);
break;
}
case 6:
{
creat2(L);
display(L);
break;
}
case 7:
{
Linklist A,B;
creat2(A);
creat2(B);
merge(A,B);
reverse(A);
display(A);
break;
}
case 8:
{
Linklist A,B;
creat2(A);
creat2(B);
merge(A,B);
display(A);
break;
}
case 9:
{
creat(L);
divide(L);
break;
}
case 10:
{
printf("创建链表请输入1(输入值为-999时停止)\n");
printf("历遍链表并输出元素输入2\n");
printf("元素逆序请输入3\n");
printf("删除所有的偶数元素结点输入4\n");
printf("在已知非递减有序链表中插入一个元素输入5\n");
printf("创建一个非递减有序单向链表输入6\n");
printf("创建两个非递减链表并合并成非递增链表输入7\n");
printf("创建两个非递减链表并合并成非递减链表输入8\n");
printf("创建一个链表并将其分成奇数和偶数两个链表输入9\n");
printf("菜单提示输入10\n");
printf("退出输入11\n");
break;
}
case 11:
{
return 0;
}
}
}
return 0;
}