数据结构线性表操作.docx
《数据结构线性表操作.docx》由会员分享,可在线阅读,更多相关《数据结构线性表操作.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构线性表操作
1.这是p1list.h自定义的头文件
//------Headfilesforlistinchapter2--------------
#include
#include
#include
//预定义常量
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineGUARD-99
#defineMAXLEN255//线性表(顺序表)的最大长度
#defineLIST_MAX_SIZE50//链表的最大长度
//函数结果的类型
typedefintStatus;
typedefintElemType;
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
typedefstructList{
intelem[MAXLEN];
intlength;
}List;
typedefunsignedcharSString[MAXLEN+1];
typedefintElemType;
typedefstructLNode{
intdata;
structLNode*next;
}LNode,*LinkList;
//----------p1list.cpp---------------------------------------------
voidInitList(List&L);//*此函数用于初始化一个保持增序的线性表L
voidInitList0(List&L);//*此函数用于初始化一个线性表L
voidprintList(ListL);
voidcreateTwoLists(List&La,List&Lb);
voidMergeList(ListLa,ListLb,List&Lc);//*TBD1*将Lb归并到La表,形成新表Lc
voidUnion(List&La,ListLb);//*TBD2*线性La和Lb分别表示两个集合,求新集合La=LaULb(U"并"操作)
voidReverseList(List&L);//*TBD3*将线性表L逆转
voiddeleteall(List&L,intx,inty);//*TBD4*从一给定的顺序表L中删除元素值在x和y之间的所有元素(x<=y)
//---------lottery.cpp----------------------------------------------
voidbuild(LinkList&L,intsize);//*TBD1*乙负责-初始化循环链表L
voiddisplay(LinkListL);//*TBD1*甲负责-在屏幕上输出链表L的内容
voidselect10(LinkList&L);//*TBD2*乙负责-实现体育彩票(10选7)
voidselect36(LinkList&L);//*TBD2*甲负责-实现体育彩票(36选7)
voidfreeList(LinkList&L);//*TBD3*甲负责-释放初始化链表L所使用的内存
voidmainlottery();//*TBD3*乙负责-实现主函数
//---------LinkedList.cpp--------------------------------------------
StatusCreateList_L(LinkList&L,intn);//采用尾插法创建一个带头结点的长度为n的单链表L
StatusCreateList_L_NoHead(LinkList&L,intn);//采用尾插法创建一个无头结点的长度为n的单链表L
voidprintList_L(LinkListL);//输出带头结点的单链表L
voidprintList_L_NoHead(LinkListL);//输出不带头结点的单链表L
StatusGetElem_L(LinkListL,inti,ElemType&e);
StatusListInsert_L(LinkList&L,inti,ElemTypee);
StatusListDelete_L(LinkList&L,inti,ElemType&e);
voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc);
voiddeleteallnodes(LinkList&L,ElemTypemin,ElemTypemax);
voidChangeLinkList01J(LinkList&L);
Statusreorder5(LinkList&L);
//---------p1list.cpp[例2-2-12]-----------------------------------
voiddeleteall_1(List*L,intx);
voiddeleteall_2(List*L,intx);
voiddeleteall_3(List*L,intx);
2.这是线性表操作代码:
//实验一:
设计一个程序实现线性表上并操作。
//e1list.cpp:
定义控制台应用程序的入口点。
//
#include"p1list.h"
/*此函数用于初始化一个保持增序的线性表L
*L的初值是通过键盘按照递增的次序一个自然数一个自然数输入的。
*/
voidInitList(List&L){//增序的;
inti=0,d;
L.elem[0]=GUARD;//-99
printf("\n输入某线性表各个元素的值(自然数),%d表示输入结束!
\n",GUARD);
do{
scanf("%d",&d);
if(d!
=GUARD){
if(i!
=0&&dprintf("\n这里要初始化一个保持增序的线性表,请输入一个不小于的%d自然数",L.elem[i-1]);
elseL.elem[i++]=d;
}
if(i==MAXLEN)printf("\n该线性表长度达到最大值\n");
}while((d!
=GUARD)&&(iL.length=i;//个数,-99没有保存;
}
/*此函数用于初始化一个线性表L
*L的初值是通过键盘一个自然数一个自然数输入的。
*/
voidInitList0(List&L){
inti=0,d;
L.elem[0]=GUARD;
printf("输入某线性表各个元素的值(自然数),%d表示输入结束!
\n",GUARD);
do{
scanf("%d",&d);
if(d!
=GUARD)L.elem[i++]=d;
if(i==MAXLEN)printf("\n该线性表长度达到最大值\n");
}while((d!
=GUARD)&&(iL.length=i;
}
voidprintList(ListL){
inti;
printf("线性表[%d]:
\n",L.length);
for(i=0;iprintf("\n");
}
voidcreateTwoLists(List&La,List&Lb){
printf("\n创建两个线性表--注意输入的两表的总长度不要超过%d\n",MAXLEN);
InitList(La);//增序的
printf("\n初始化线性表Lb,其长度不超过%d。
超出部分被截断!
\n",MAXLEN-La.length);
InitList(Lb);
if(La.length+Lb.length>MAXLEN)Lb.length=MAXLEN-La.length;//
}
/*TBD1*将Lb归并到La表,形成新表Lc
*TBD1*要求L0.c保持有序,允许出现重复元素
*TB
D1*/
voidMergeList(ListLa,ListLb,List&Lc){
inti=0,j=0,m=0;
while(iif(La.elem[i]>=Lb.elem[j])
Lc.elem[m++]=Lb.elem[j++];
elseLc.elem[m++]=La.elem[i++];
}
while(iLc.elem[m++]=La.elem[i++];
while(jLc.elem[m++]=Lb.elem[j++];
Lc.length=La.length+Lb.length;
}
/*TBD2*线性La和Lb分别表示两个集合,求新集合La=LaULb(U"并"操作)
*TBD2*注意集合里不允许出现重复元素
*TBD2*/
voidUnion(List&La,ListLb){
inti=0,j=0,t,m=La.length;t=m;
while(iif(La.elem[i]i++;
}
elseif(La.elem[i]==Lb.elem[j]){
i++;j++;
}
else{
while(t>=i+1){
La.elem[t]=La.elem[t-1];
t--;
}
La.elem[i++]=Lb.elem[j++];
t=++La.length;
}
}
while(jLa.elem[i++]=Lb.elem[j++];
La.length=i;
}
/*TBD3*将线性表L逆转
*TBD3*要求使用最少的附加空间,空间复杂度为O
(1)。
*TBD3*/
voidReverseList(List&L){
intj,i,n,c;
j=L.length-1;
n=L.length/2;//取半;
for(i=0;ic=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j--]=c;
}
}
/*TBD4*从一给定的顺序表L中删除元素值在x和y之间的所有元素(x<=y)
*TBD4*要求以较高的效率实现,空间复杂度为O
(1)。
*TBD4*/
voiddeleteall(List&L,intx,inty){
inti=0,n=0;
for(;iif(L.elem[i]y)//机智啊把对的重新放一遍;
L.elem[n++]=L.elem[i];
}
L.length=n;
}
intmain(intargc,char*argv[])
{
ListLa,Lb,Lc;
intx,y,n,h;
intj;
while
(1){printf("\n1-创建数组La,Lb,2-合并数组La,Lb到Lc,含重复元素3-归并Lb到La,不重复\n");