哈工大线性表部分作业练习.docx
- 文档编号:8279629
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:19.03KB
哈工大线性表部分作业练习.docx
《哈工大线性表部分作业练习.docx》由会员分享,可在线阅读,更多相关《哈工大线性表部分作业练习.docx(20页珍藏版)》请在冰豆网上搜索。
哈工大线性表部分作业练习
(一)线性表部分
1.实现线性表的顺序存储结构,并分析每个基本操作(算法)的时间复杂度。
#include
#definemaxlength20
#include
usingnamespacestd;
structLIST
{
charelements[maxlength];
intlast;
};
typedefintposition;
voidMakeNull(LIST&L)
{
L.last=0;
}
positionEnd(LISTL)
{
return(L.last+1);
}
voidshowlist(LISTL)
//打印线性表
{
inti=0;
for(i=0;i<=L.last;i++)
{
printf("%c",L.elements[i]);
}
}
voidInsert(charx,positionp,LIST&L)
//insert把X插入到表L的P处
{
positionq;
if(L.last>=maxlength-1)
printf("listisfull");
elseif((p>L.last+1)||(p<0))
printf("positiondosenotexist");
else{
for(q=L.last;q>=p;q--)
//将位置p,p+1,的元素向下移动一个位置
L.elements[q+1]=L.elements[q];
L.last=L.last+1;
L.elements[p]=x;
showlist(L);
}
}
voidDelete(positionp,LIST&L)
{
positionq;
if((p>L.last)||(p<0))
printf("positiondoesnotexist");
else{
L.last=L.last-1;
for(q=p;q<=L.last;q++)
{L.elements[q]=L.elements[q+1];}
showlist(L);
}
}
voidLocate(charx,LISTL)
//返回L表中X元素的位置
{
positionq;
for(q=0;q<=L.last;q++)
{if(L.elements[q]==x)
printf("%c在第%d位\n",x,q+1);}
}
intmain()
{
inta,p,i=0;
charx,z[100];
LISTL;
MakeNull(L);
printf("输入元素初始化表(20个数以内)\n");
gets(z);
while(z[i]!
='\0'&&i<20)
{
L.elements[i]=z[i];
i++;
L.last=L.last+1;
}
L.last=L.last-1;
printf("表如下:
");
showlist(L);
while(a!
=0)
{
printf("\n1.插入操作。
\n");
printf("2.删除操作。
\n");
printf("3.查询操作。
\n");
printf("0退出。
\n");
scanf("%d",&a);
if(a==1)
{printf("输入:
元素位置\n");
getchar();
scanf("%c%d",&x,&p);
Insert(x,p-1,L);
}
elseif(a==2)
{
printf("输入位置\n");
scanf("%d",&p);
Delete(p-1,L);
}
elseif(a==3)
{
printf("输入查询元素");
getchar();
scanf("%c",&x);
Locate(x,L);
}
}
}
时间复杂度分析:
Insert函数:
O(n)
Delete函数:
O(n)
Locate函数:
O(n)
2.实现线性表的带表头结点的单链表存储结构,并分析每种基本操作(算法)的时间复杂度。
#include
usingnamespacestd;
typedefchardatatype;
typedefstructnode*pointer;
structnode{
datatypedata;
pointernext;
};
typedefpointerlklist;
lklistcreat();/*建立链表*/
lklistinitlist();/*初始化*/
intlength(lklisthead);/*链表长度*/
pointerget(lklisthead,inti);/*搜索结点的值*/
intlocate(lklisthead,datatypex);/*查找元素位置*/
voidshow(lklisthead);/*遍历显示*/
voidinsertlk(lklisthead,datatypex,inti);/*插入*/
voiddeletelk(lklisthead,inti);/*删除*/
intmain()/*带表头结点*/
{pointerhead;
inti;
datatypex;
head=creat();
cin>>i>>x;
show(head);
cout< "< cout<<"序号为"< "< cout<<"值为"< "< deletelk(head,5); show(head); insertlk(head,'x',5); show(head); return0; } lklistcreat() { pointerhead,p,rear; datatypech; head=initlist();//添加表头 rear=head; while(cin>>ch,ch! ='$') { p=newnode; p->data=ch; rear->next=p; rear=p; } rear->next=NULL; returnhead; } lklistinitlist() { pointerp; p=newnode; p->next=NULL; returnp; } intlength(lklisthead) { pointers; intj=0; s=head->next; while(s! =NULL) { j++; s=s->next; } returnj; } pointerget(lklisthead,inti) { pointerp; intj=0; if(i==0)returnhead; if(i<0)returnNULL; p=head->next; while(p! =NULL) { j++; if(j==i)break; p=p->next; } returnp; } intlocate(lklisthead,datatypex) { pointerp; intj=0; p=head->next; while(p! =NULL) {j++; if(p->data==x)break; p=p->next; } if(p! =NULL)returnj; elsereturn-1; } voidshow(lklisthead) { pointerp; p=head->next; while(p! =NULL) { cout< p=p->next; } cout< } voidinsertlk(lklisthead,datatypex,inti) { pointerp,q; p=get(head,i-1); while(p==NULL) cout<<"非法插入位置! "< q=newstructnode; q->data=x; q->next=p->next; p->next=q; } voiddeletelk(lklisthead,inti) { pointerp,q; q=get(head,i-1); while(q==NULL||q->next==NULL) { cout<<"非法输出位置! "< return; } p=q->next; q->next=p->next; deletep; } 3.实现线性表的不带表头结点的单链表存储结构,并分析每种基本操作(算法)的时间复杂度 #include usingnamespacestd; typedefchardatatype; typedefstructnode*pointer; structnode{ datatypedata; pointernext; }; typedefpointerlklist; lklistcreat();/*建立链表*/ lklistinitlist();/*初始化*/ intlength(lklisthead);/*链表长度*/ pointerget(lklisthead,inti);/*搜索结点的值*/ intlocate(lklisthead,datatypex);/*查找元素位置*/ voidshow(lklisthead);/*遍历显示*/ voidinsertlk(lklisthead,datatypex,inti);/*插入*/ voiddeletelk(lklisthead,inti);/*删除*/ intmain()/*带表头结点*/ {pointerhead; inti; datatypex; head=creat(); cin>>i>>x; show(head); cout< "< cout<<"序号为"< "< cout<<"值为"< "< deletelk(head,5); show(head); insertlk(head,'x',5); show(head); return0; } lklistcreat() { pointerhead,p,rear; datatypech; head=initlist();//添加表头 rear=head; inti=0; while(cin>>ch,ch! ='$') { p=newnode; p->data=ch; if(i==0) { p=head; { Else { rear->next=p; rear=p; } } rear->next=NULL; returnhead; } lklistinitlist() { pointerp; p=newnode; returnp; } intlength(lklisthead) { pointers; intj=0; s=head->next; while(s! =NULL) { j++; s=s->next; } returnj; } pointerget(lklisthead,inti) { pointerp; intj=0; if(i==0)returnhead; if(i<0)returnNULL; p=head->next; while(p! =NULL) { j++; if(j==i)break; p=p->next; } returnp; } intlocate(lklisthead,datatypex) { pointerp; intj=0; p=head->next; while(p! =NULL) {j++; if(p->data==x)break; p=p->next; } if(p! =NULL)returnj; elsereturn-1; } voidshow(lklisthead) { pointerp; p=head->next; while(p! =NULL) { cout< p=p->next; } cout< } voidinsertlk(lklisthead,datatypex,inti) { pointerp,q; p=get(head,i-1); while(p==NULL) cout<<"非法插入位置! "< q=newstructnode; q->data=x; q->next=p->next; p->next=q; } voiddeletelk(lklisthead,inti) { pointerp,q; q=get(head,i-1); while(q==NULL||q->next==NULL) { cout<<"非法输出位置! "< return; } p=q->next; q->next=p->next; deletep; } 4.实现线性表的游标存储结构,并分析每种基本操作(算法)的时间复杂度。 #include #include #include #definemaxsize100 usingnamespacestd; typedefstruct{ chardata; intnext; }spacestr;//存储结构定义 spacestrSPACE[maxsize]; typedefintposition,Cursor; CursorL,M,avail; spacestrcreate();//建立静态链表 voidInitialize();//可用空间初始化 CursorDeleteNode();//可用空间的分配操作 voidFreeNode(Cursorq);//可用空间的回收操作 voidInsert(intx,positionp,spacestrSPACE[]);//插入操作 voidDelete(positionp,spacestrSPACE[]);//删除操作 intmain() { intp,x; Initialize();//可用空间初始化 p=GetNode();//可用空间的分配操作 Insert(x,p,SPACE[]);//插入操作 q=newcelltype; q->data=x; q->next=p->next; p->next=q; } spacestrcreate(SPACE[])//时间复杂度O(n) { spacestr*head,p,rear; charch; Initialize(); head=SPACE; while(cin>>ch,ch! ='$') { p=newnode; p->data=ch; p=rear; } p->next=NULL; returnhead; } voidInitialize()//时间复杂度O(n) { intj; /*依次链接池中结点*/ for(j=0;j SPACE[j].next=j+1; /*最后一个结点指针域为空*/ SPACE[j].next=-1; /*标识线性表*/ avail=0; } CursorDeleteNode()//从存储池SPACE中删除一个结点,删除的是avail的next所指向的下一个结点时间复杂度O (1) { Cursorp; if(SPACE[avail].next==-1) p=-1; else { p=SPACE[avail].next; SPACE[avail].next=SPACE[p].next; } returnp; } voidFreeNode(Cursorq)//deleteq;时间复杂度O(n) { SPACE[q].next=SPACE[avail].next; SPACE[avail].next=q; }//放回池中 voidInsert(intx,positionp,spacestrSPACE[])//插入操作时间复杂度O (1) { positionq; q=GetNode(); SPACE[q].data=x; SPACE[q].next=SPACE[p].next; SPACE[p].next=q; } q=newcelltype; q->data=x; q->next=p->next; p->next=q; voidDelete(positionp,spacestrSPACE[])//删除操作时间复杂度O (1) { positionq; if(SPACE[p].next! =-1) { q=SPACE[p].next; SPACE[p].next=SPACE[q].next; FreeNode(q); } } p->next! =NULL; q=p->next; p->next=q->next; deleteq; (二)栈、队列和串部分 五.算法设计(作业,必须交) ⑴假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。 试设计相应的入队和出队的算法。 入队算法: Voidrudui(Node { S=newNode s->data=x; if(rear==NULL) { rear=s; rear->next=s; } else{ s->next=reear->next; rear->next=s; rear=s; } } 出队算法: voidchudui(Node { If(rear==NULL)throw”underflow” else{ s=rear->next; if(s==rear)rear=NULL; elserear->next=s->next; deletes; } } ⑵设顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n,a2n-1,…,a1,要求通过一个循环队列重新排列栈中元素,使得从栈顶到栈底的元素依次为a2n,a2n-2,…,a2,a2n-1,a2n-3,…,a1,请设计算法实现该操作,要求空间复杂度和时间复杂度均为O(n)。 1.将所有元素出栈并入队 2.依次将队列元素出队;如果是偶数终点,则再入队,如果是奇数结点,则入栈 3.将奇数结点出栈并入队 4.将偶数结点出队并入栈 5.将所有元素出栈并入队 6.将所有元素出队并入栈为所求 ⑶设计算法把一个十进制整数转换为二至九进制之间的任一进制数输出。 voidjinzhi(intnum,intr) { Top=-1; While(num! 0) { K=num%r; S[++top]=k; Num=num/r; } While(top! =-1) Cout< } ⑷假设一个算术表达式中可以包含三种括号: 圆括号“(”和“)”,方括号“[”和“]”以及花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用。 编写算法判断给定表达式中所含括号是否配对出现。 括号匹配算法: voidkuo(chara[],intn) { Top=-1;i=0;flag=1; While(i { If(a[i]=’(‘||a[i]=’[‘||a[i]=’{‘)S[++top]=a[i++]; Else{ Switcha[i] { case‘)’if(top==-1||S[top--]! =‘(’)flag=0;break; case‘]’if(top==-1||S[top--]! =‘[’)flag=0;break; case‘}’if(top==-1||S[top--]! =‘{’)flag=0;break; } }i++; } } ⑸对串的模式匹配KMP算法设计求模式滑动位置的next函数。 (三)多维数组和广义表部分 五.算法设计(作业,必须交) 1.若在矩阵A中存在一个元素ai,j(0≤i≤n-1,0≤j≤m-1),该元素是第i行元素中最小值且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。 假设以二维数组存储矩阵A,试设计一个求该矩阵所有马鞍点的算法,并分析最坏情况下的时间复杂度。 马鞍点算法: voidandian(inta[][],intm,intn) { for(i=0;i { d=a[i][0];k=0; for(j=1;j if(a[i][j] {d=a[i][j];k=j;} for(j=0;j if(a[j][k]>d)break; if(j==n)cout<<”输出鞍点”< } } 算法分析: 时间复杂度为O(mn+n2). 2.已知两个n×n的对称矩阵按压缩存储方法存储在一维数组A和B中,编写算法计算对称矩阵的乘积。 矩阵
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 线性 部分 作业 练习