数据结构顺序表与链表Word格式文档下载.docx
《数据结构顺序表与链表Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构顺序表与链表Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
本程序包含的函数
主函数main()
判断是否对称函数Symmetric()
排序的函数DataSort()
其中main函数负责操作其他的函数。
三、调试分析
在调试过程中要注意的就是输入多注意特殊值以及不要输入错误那个个数,因为要求输入的数比较多,所以要细心一点
四、详细代码及运行结果
#include<
stdio.h>
stdlib.h>
#defineMAX300
intSymmetric(intL[],intm);
voidDataSort(intnumber[],intr);
intmain()
{
intA[MAX]={0},Odd[MAX]={0},Even[MAX]={0};
intB[500],C[500],D[1000];
intLb,Lc;
inti,La,a,n,p,w;
intFound,flag=0,time=0,k=0,tb=0,tc=0;
scanf("
%d"
&
La);
for(i=0;
i<
La;
i++)
A[i]);
Found);
{
printf("
%d"
A[i]);
if(A[i]==Found)
flag=1;
}
\n"
);
if(flag==1)
Yes,Ifoundit!
else
Notfound!
a=Symmetric(A,La);
if(a==1)printf("
It'
ssymmetric.\n"
elseprintf("
Itisn'
tsymmetric.\n"
i=0;
while(i<
La)
if(A[i]%2==0)
Even[time++]=A[i];
i++;
elseif(A[i]%2!
=0)
Odd[k++]=A[i];
for(p=k,w=0;
w<
time;
w++,p++)
Odd[p]=Even[w];
for(p=0;
p<
(time+k);
p++)
Odd[p]);
DataSort(A,La);
Lb);
Lc);
Lb;
B[i]);
for(n=0;
n<
Lc;
n++)
C[n]);
DataSort(B,Lb);
DataSort(C,Lc);
Lb+Lc;
if(B[tb]>
C[tc])
D[i]=B[tb];
tb++;
D[i]=C[tc];
tc++;
D[i]);
return0;
}
intSymmetric(intL[],intm)
intl;
if(m%2==0)
for(l=0;
l<
m/2;
l++)
if(L[l]!
=L[m-l-1])
(m-1)/2;
return1;
voidDataSort(intnumber[],intr)
intj,h,o,num;
for(j=0;
j<
r-1;
j++)
h=j;
for(o=j+1;
o<
r;
o++)
if(number[o]>
number[h])
h=o;
if(h!
=j)
num=number[h];
number[h]=number[j];
number[j]=num;
number[j]);
2、链表的应用
(1).键盘输入一组元素,建立一个无头结点的单向链表(无序)。
(2).遍历(打印)单向链表。
(3).把单向链表中元素逆置(不允许申请新的结点空间)。
(4).在单向链表中删除所有的偶数元素结点。
(5).对链表排序,排序后链表元素按照非递减方式排列(注意:
排序时如果要交换两个结点的顺序,不得通过交换结点的内容,而需要使用改变指针的方式交换结点的位置。
建议使用直接插入排序算法)。
(6).利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
(7).利用算法1建立的链表,删除链表中的重复元素。
(8).利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(9).判断算法1和算法5生成单链表所表示的集合是否相等。
(10).在主函数中设计一个简单的菜单,分别调试上述算法。
一、概要设计
本程序包含的函数
建立链表函数Linklistcreate()
复制单链表内容函数LinklistCopy()
遍历链表函数Outline()
逆置单链表函数Linklistnizhi()
删除偶数结点函数DeleteEven()
链表排序函数LinklistSort()
将两个链表合并函数fuzhi()
删除链表重复元素LinklistDeleteEqual()
将链表分为一个奇数链表和一个偶数链表函数Separate()
判断链表是否相等函数judge()
二、调试分析
在调试的过程中在算法六中一直出现错误,两个链表合并后排序输出时一直多输入一个元素,在第四个算法的时候开始理解错了题目的意思,最后发现是要删除偶数的结点,其他的有参考其他的代码
三、使用说明
运行后直接输入1~9的数来执行整个代码的功能
1.输入链表一的元素
2.遍历链表
3.把单向链表逆置
4.删除偶数结点
5.对链表非递减排序
6.建立链表,合并,按非递减排序
7.删除单链表中的重复元素
8.将链表分解成一个奇数链表一个偶数链表
9.判断算法一与算法五生成的单链表是否相等
四、源代码
typedefstructNode
intdata;
structNode*next;
}LNode,*Linklist;
Linklistcreate()
Linklisthead,p,q;
head=(Linklist)malloc(sizeof(LNode));
head->
next=NULL;
p=head;
intn;
n);
while(n!
=-1)
q=(Linklist)malloc(sizeof(LNode));
q->
data=n;
p->
next=q;
p=q;
returnhead;
LinklistCopy(LinklistL)
Linklistp,q,r,s;
p=NULL;
q=L;
for(;
q!
=NULL;
)
r=(Linklist)malloc(sizeof(LNode));
r->
data=q->
data;
if(p==NULL)
p=s=r;
s->
next=r;
s=r;
q=q->
next;
returnp;
voidOutline(LinklistL)
Linklistp;
p=L->
while(p!
=NULL)
p->
data);
p=p->
Linklistnizhi(LinklistL)
Linklistp,q,head=Copy(L);
p=head->
while(p)
q=p;
next=head->
voidDeleteEven(LinklistL)
Linklistq,q1,head=Copy(L),p;
inti=1;
q1=head;
q=head;
next,i++)
if(i%2==0)
next=q->
Outline(q1);
LinklistSort(LinklistL)
Linklistp,q,r,head=Copy(L);
if(p!
r=p->
p=r;
while(q->
next!
=NULL&
&
next->
data<
data)
next=p;
voidfuzhi(Linklistla,Linklistlb)
Linklistp,q,r;
p=la;
q=lb;
r=p;
r->
next!
r=r->
next);
Outline(Sort(p));
LinklistDeleteEqual(LinklistL)
next)
if(q->
data==p->
r=q->
next=r->
free(r);
voidSeparate(LinklistL)
Linklistp,q,r,s,k,head=Copy(L);
p=(Linklist)malloc(sizeof(LNode));
s=q;
k=head->
while(k)
if(k->
data%2==0)
next=k;
r=k;
k=k->
s=k;
Outline(p);
Outline(q);
voidjudge(LinklistL1,LinklistL2)
Linklistp=L1,q=L2;
p!
next,q=q->
if(p->
data!
=q->
Different!
return;
Same!
LinklistM,L1,L2;
M=(Linklist)malloc(sizeof(LNode));
L1=(Linklist)malloc(sizeof(LNode));
L2=(Linklist)malloc(sizeof(LNode));
while(scanf("
n)!
=EOF)
switch(n)
case1:
算法一:
输入链表一的元素\n"
M=create();
break;
case2:
算法二:
遍历链表\n"
Outline(M);
case3:
算法三:
把单向链表逆置\n"
Outline(nizhi(M));
case4:
算法四:
删除偶数结点\n"
DeleteEven(M);
case5:
算法五:
对链表非递减排序\n"
Outline(Sort(M));
case6:
算法六:
建立链表,合并,按非递减排序\n"
L1=create();
L2=create();
fuzhi(L1,L2);
case7:
算法七:
删除单链表中的重复元素\n"
Outline(DeleteEqual(M));
case8:
算法八:
将链表分解成一个奇数链表一个偶数链表\n"
Separate(M);
case9:
算法九:
判断算法一与算法五生成的单链表是否相等\n"
judge(M,Sort(M));
case0:
exit(0);
default:
输入错误!
【选作内容】
(11).利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
(12).采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。
【注意事项】
1.为了看到操作结果,在每次链表操作后,均需打印出链表的内容。
2.单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。
3.演示及撰写实验报告时,一定要注意各种情况的测试。
比如算法7删除节点的操作,至少要测试以下几种情况:
(1)找不到元素;
(2)要删除的元素是链表第一个节点;
(3)要删除的元素是链表的最后一个节点;
(4)要删除的元素在链表的中间。