实验一 线性表的有关操作
一、实验学时:2学时
二、背景知识:单链表的插入、删除及应用。
三、目的要求:
1、掌握单向链表的存储特点及其实现。
2、理解和掌握单链表的类型定义方法和结点生成方法。
3、掌握单向链表的插入、删除算法及其应用算法的程序实现。
四、实验内容:
1、随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2、遍历单向链表(显示)。
3、把单向链表中元素逆置(不允许申请新的结点空间)。
4、在单向链表中删除所有的偶数元素(值为偶数)结点。
5、编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6、利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7、利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8、编写一个主函数,调试上述算法。
五、实验说明:
1、类型定义
typedefint ElemType;//元素类型
typedef struct node
{ElemTypedata;
structnode *next;
}LNode,*LinkList;
2、为了算法实现简单,最好采用带头结点的单向链表。
六、注意问题:
1、重点理解链式存储的特点及指针的含义。
2、注意比较顺序存储与链式存储的各自特点。
3、注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
4
、单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct node
{
int data;
struct node *next;
} LNode,*LinkList;
void init(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
void createlist(LinkList &L,int n)
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<n;i++)
{ p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=L->next;L->next=p;
}
}
void outputlist(LinkList &L)
{ LinkList p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
printf(" 显示完成!!!!!!\n");
}
//void converse(LinkList head)
//{
// LinkList p,q;
// p=head->next;
// head->next=NULL;
// while(p)
// {
// /*向后挪动一个位置*/
// q=p;
// p=p->next;
//
// /*头插*/
// q->next=head->next;
// head->next=q;
// }
//}
void Reverse(LinkList &L)
{
LinkList last = L->next;
LinkList first;
while(last->next)
{
first = L->next;
L->next = last->next;
last->next = L->next->next;
L->next->next = first;
}
//void converse(LinkList head)
//{
// LinkList p,q;
// p=head->next;
// head->next=NULL;
// while(p)
// {
// /*向后挪动一个位置*/
// q=p;
// p=p->next;
//
// /*头插*/
// q->next=head->next;
// head->next=q;
// }
//}
void Reverse(LinkList &L)
{
LinkList last = L->next;
LinkList first;
while(last->next)
{
first = L->next;
L->next = last->next;
last->next = L->next->next;
L->next->next = first;
}
}
void shanou(LinkList head)
{
void shanou(LinkList head)
{
LinkList p,q;
q=head;
p=head->next;
while(p)
{
if((p->data%2!=0))
{
p=p->next;
p=p->next;
q=q->next;
}
else
{q->next=p->next;
p=p->next;
}
}
printf("shanou后的链式表为:\n");
p=head->next;
while(p)
{printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
void Srot(LinkList L) //对数据非递减排序
void Srot(LinkList L) //对数据非递减排序
{
LinkList p,q,T;
ElemType m;
int chan=-1;
p = L->next;
for(;p!=NULL;p=p->next)
{
T = p;
for(q=p->next;q!=NULL;q=q->next)
{
if((q->data)<(T->data))
T = q;
}
m = T->data;
T->data = p->data;
p->data = m;
}
printf("排序完成!\n"); }
void ListInsert(LinkList &L1,ElemType e) //插入数据;
{ // init(L);
LinkList p,q,T;
//int chan = -1;
//Srot(L);
T=(LinkList)malloc(sizeof(LNode)); //创建插入的结点;
T->data = e;
p = L1;
q = p->next;
while(q)
{
// if(q->data>e||q->data==e)
// break;
// p = p->next;
// q = q->next;
q=q->next;
}
q->next=T;
T->next=NULL;
Srot(L1);
// T->next = q;
// p->next = T;
// printf("插入完成!\n");
// printf("按“1”输出:");
// scanf("%d",&chan);
// if(chan)
// outputlist(L);
}
//void insert_sert(LinkList &L,int i)
//{
// LinkList s;
// s=(LinkList)malloc(sizeof(LNode));
// s->data=i;
// static int n=0;
// int m=0;
// LinkList p,q;
// p=L;
//// cout<<n<<endl;
//// Sleep(1000);
// if(n==0)
// {
// s->next=NULL;
// L->next=s;
// n++;
// }
// else
// {
// while(p->next!=NULL)
// {
// q=p->next;
// if(s->data<q->data)
// {
// s->next=q;
// p->next=s;
// m=1;
// break;
// }
// p=p->next;
// }
// if(m==0)
// {
// //s->next=NULL;
// p->next=s;
// }
// }
//
//}
void DecreasePro_L(LinkList &La,LinkList &Lb)
{
LinkList pa,pb,pc,Lc;
Reverse(La);
Reverse(Lb);
Lc = pc = La;
pa = La->next;
pb = Lb->next;
while(pa&&pb)
{
if((pa->data)>(pb->data)||(pa->data)==(pb->data))
{ pc->next = pa;
pc = pa;
pa = pa->next;
}else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
if(pa==NULL)
{
pc->next = pb;
}
if(pb==NULL)
{
{
LinkList pa,pb,pc,Lc;
Reverse(La);
Reverse(Lb);
Lc = pc = La;
pa = La->next;
pb = Lb->next;
while(pa&&pb)
{
if((pa->data)>(pb->data)||(pa->data)==(pb->data))
{ pc->next = pa;
pc = pa;
pa = pa->next;
}else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
if(pa==NULL)
{
pc->next = pb;
}
if(pb==NULL)
{
pc->next = pa;
}
La = Lc;
free(Lb);
printf("非递增归并完成!\n");
}
La = Lc;
free(Lb);
printf("非递增归并完成!\n");
}
void surface(){
int i;
printf(" ");
for(i=1;i<=47;i++)
printf("%c",4);
printf("\n");
printf(" |%c%c%c%c 线性表的有关操作 %c%c%c%c|\n",3,4,5,6,3,4,5,6);
printf(" |%c 1.输入数据产生无序链表 6.合成递增链表 %c|\n",5,5);
printf(" |%c 2.插入元素产生递增链表 7.遍历单向链表(显示) %c|\n",5,5);
printf(" |%c 3.单向链表中元素就地逆置 8. %c|\n",5,5);
printf(" |%c 4.单向链表中删除所有的偶数元素 9. %c|\n",5,5);
printf(" |%c 5.合成递减链表 10.运行结束 %c|\n",5,5);
printf(" ");
for(i=1;i<=47;i++)
printf("%c",4);
printf("\n");
printf(" ------王祥\n");
}
int main()
void surface(){
int i;
printf(" ");
for(i=1;i<=47;i++)
printf("%c",4);
printf("\n");
printf(" |%c%c%c%c 线性表的有关操作 %c%c%c%c|\n",3,4,5,6,3,4,5,6);
printf(" |%c 1.输入数据产生无序链表 6.合成递增链表 %c|\n",5,5);
printf(" |%c 2.插入元素产生递增链表 7.遍历单向链表(显示) %c|\n",5,5);
printf(" |%c 3.单向链表中元素就地逆置 8. %c|\n",5,5);
printf(" |%c 4.单向链表中删除所有的偶数元素 9. %c|\n",5,5);
printf(" |%c 5.合成递减链表 10.运行结束 %c|\n",5,5);
printf(" ");
for(i=1;i<=47;i++)
printf("%c",4);
printf("\n");
printf(" ------王祥\n");
}
int main()
{
int num;
LinkList L1;
while(1){
surface();
int i;
int num;
LinkList L1;
while(1){
surface();
int i;
printf("请输入1——10中某个数字实现其对应功能:\n");
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
cin>>num;
if(num==10){
printf("%c%c%c感谢您的使用!%c%c%c\n",1,1,1,1,1,1);
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
break;
}
if(num<=0||num>10){
printf("x_x请按正确格式输入x_x\n");
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
continue;
}
if(num==1){
printf("请输入链表长度\n");
int n;
cin>>n;
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
cin>>num;
if(num==10){
printf("%c%c%c感谢您的使用!%c%c%c\n",1,1,1,1,1,1);
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
break;
}
if(num<=0||num>10){
printf("x_x请按正确格式输入x_x\n");
for(i=1;i<=37;i++)
printf("%c",4);
printf("\n");
continue;
}
if(num==1){
printf("请输入链表长度\n");
int n;
cin>>n;
createlist(L1,n);
}
if(num==7){
}
if(num==7){
outputlist(L1);
}
if(num==2){
cout<<"请输入数据个数"<<endl;
int i,j,a;
cin>>i;
if(num==2){
cout<<"请输入数据个数"<<endl;
int i,j,a;
cin>>i;
createlist(L1,i);
Srot(L1);
Srot(L1);
}
if(num==3){
Reverse(L1);
outputlist(L1);
cout<<"就地逆置完成"<<endl;
outputlist(L1);
cout<<"就地逆置完成"<<endl;
}
if(num==4){
if(num==4){
shanou(L1);
cout<<"删偶完成!!!"<<endl;
}
if(num==6){
cout<<"删偶完成!!!"<<endl;
}
if(num==6){
LinkList L2;
int q,w;
printf("请输入第一个链表的长度\n");
scanf("%d",&q);
createlist(L1,q);
printf("请输入第二个链表的长度\n");
scanf("%d",&w);
createlist(L2,w);
DecreasePro_L(L1,L2);
Srot(L1);
int q,w;
printf("请输入第一个链表的长度\n");
scanf("%d",&q);
createlist(L1,q);
printf("请输入第二个链表的长度\n");
scanf("%d",&w);
createlist(L2,w);
DecreasePro_L(L1,L2);
Srot(L1);
outputlist(L1);
}
if(num==5){
}
if(num==5){
LinkList L2;
int q,w;
printf("请输入第一个链表的长度\n");
scanf("%d",&q);
createlist(L1,q);
printf("请输入第二个链表的长度\n");
scanf("%d",&w);
createlist(L2,w);
DecreasePro_L(L1,L2);
Srot(L1);
Reverse(L1);
outputlist(L1);
}
int q,w;
printf("请输入第一个链表的长度\n");
scanf("%d",&q);
createlist(L1,q);
printf("请输入第二个链表的长度\n");
scanf("%d",&w);
createlist(L2,w);
DecreasePro_L(L1,L2);
Srot(L1);
Reverse(L1);
outputlist(L1);
}
}
return 0;
}
return 0;
}