数据结构实验15答案.docx
《数据结构实验15答案.docx》由会员分享,可在线阅读,更多相关《数据结构实验15答案.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构实验15答案.docx](https://file1.bdocx.com/fileroot1/2022-12/31/4da4c787-bdfe-4527-a883-0819e8a38efd/4da4c787-bdfe-4527-a883-0819e8a38efd1.gif)
数据结构实验15答案
数据结构实验
1、设计序链表,要求:
(1)链表的基本操作:
初始化、求数据元素个数、插入、删除和取数据元素。
(2)设计一个测试主函数,验证链表的正确性。
#include
#include
#defineERROR-1
#defineOK1
typedefstructNode
{
chardata;
structNode*next;
}Node,*LinkList;
voidInitList(LinkList*L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
voidCreateFromHead(LinkListL)/*头插法*/
{
Node*s;
charc;
intflag=1;
printf("输入要插入的结点,输入$结束");
while(flag)
{
c=getchar();
if(c!
='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}
elseflag=0;
}
}
Node*get(LinkListL,inti)/*查找*/
{
intj;
Node*p;
if(i<=0)returnNULL;
p=L;
j=0;
while((p->next!
=NULL)&&(j
{
p=p->next;
j++;
}
if(i==j)returnp;
elsereturnNULL;
}
intListLength(LinkListL)/*求长度*/
{
Node*p;
intj;
p=L->next;
j=0;
while(p!
=NULL)
{
p=p->next;
j++;
}
returnj;
}
intDelList(LinkListL,inti,char*e)/*删除*/
{
Node*pre,*r;
intk;
pre=L;
k=0;
while(pre->next!
=NULL&&k{
pre=pre->next;
k=k+1;
}
if(!
(pre->next))
{
printf("删除结点的位置i不合理!
");
returnERROR;
}
r=pre->next;
pre->next=pre->next->next;
e=r->data;
free(r);
returnOK;
}
main()
{
Node*p;
inti;
char*e=0,m=0;
LinkListL;
InitList(&L);
CreateFromHead(L);
i=ListLength(L);
printf("输入要删除的结点\n");
scanf("%d",&i);
DelList(L,i,e);
printf("输入要提取的结点\n");
scanf("%d",&i);
p=get(L,i);
printf("长度为%d\n",i);
printf("结点=%c",p->data);
}
2、堆栈设计,要求:
(1)设计顺序堆栈,堆栈的操作包括:
初始化,非空否,入栈,取栈顶数据元素。
(2)设计一个主函数对顺序堆栈进行测试。
#include
#defineM50
#defineFALSE-1
#defineTRUE1
typedefstructstack
{
intelem[M];
inttop;
}SeqStack;
voidInitStack(SeqStack*s)
{
s->top=-1;
}
intpush(SeqStack*s,intx)
{
if(s->top==M-1)
return(FALSE);
s->top++;
s->elem[s->top]=x;
return(TRUE);
}
intGetTop(SeqStack*s,intx)
{
if(s->top==-1)
return(FALSE);
else
{
x=s->elem[s->top];
return(x);
}
}
voidmain()
{
intm,p;
SeqStacks;
InitStack(&s);
printf("输入数据,输入0结束");
while(m)
{
scanf("%d",&m);
push(&s,m);
}
printf("取栈顶数据元素输入1,否则输入0");
scanf("%d",&m);
if(m==1)
p=GetTop(&s,m);
printf("栈顶数据元素%d",p);
}
上机实验3:
编写一个函数,完成字符串S1寻找子字符串S2
(匹配),并编写主函数测试所编写程序。
#include
#include
#defineMaxSize100
typedefstruct//定义串
{
charstr[MaxSize];
intlen;
}String;
voidDisplay(String*s)//显示s串
{
inti;
printf("\n");
for(i=0;ilen;i++)
printf("%c",s->str[i]);
}
voidStrDelete(String*s,inti,intk)/*删掉s串中位置i开始的k个字符*/
{
intj;
if(i>s->len||i+k>s->len)
printf("位置参数值错误\n");
else
{
for(j=i+k;jlen;j++)/*将s的第i+k个位置之后的字串前移k位*/
s->str[j-k]=s->str[j];
s->len=s->len-k;/*修改s长度*/
s->str[s->len]='\0';
}
}
StrIndex(Strings,Stringt)/*求s串中t子串的位置(从0开始)*/
{
inti=0,j=0;
while(i{
if(s.str[i]==t.str[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==t.len)
{
printf("子串是");
for(i=0;iprintf("%c",t.str[i]);
}
else
printf("子串不存在");
}
voidStrInsert(String*s,inti,Stringt)/*s串中位置i处插入t串*/
{
Stringr;
intj;
if(i>s->len)
printf("位置参数值错误\n");
else
{
for(j=i;jlen;j++)/*将s的第i个位置之后的字串复制到r中*/
r.str[j-i]=s->str[j];
r.len=j-i;
r.str[r.len]='\0';
for(j=0;js->str[i+j]=t.str[j];
for(j=0;js->str[i+t.len+j]=r.str[j];
s->len=s->len+t.len;/*修改s串长度*/
s->str[s->len]='\0';
}
}
voidStrAssign(String*s,chart[])/*s串内容由t串内容代替*/
{
inti=0;
while(t[i]!
='\0')
{
s->str[i]=t[i];
i++;
}
s->str[i]='\0';
s->len=i;
}
voidmain()
{
Stringa,b;
charc[20];
printf("请输入字串s1\n");
scanf("%s",c);
StrAssign(&a,c);
a.len=20;
printf("请输入三位数字串s2\n");
scanf("%s",c);
StrAssign(&b,c);
b.len=3;
StrIndex(a,b);
Display(&a);
Display(&b);
getch();
}
上机实验4:
设矩阵A、B、C为压缩存储方式的n阶上3角矩阵,矩阵元素为整数,要求:
(1)编写实现矩阵加C=A+B的函数;
(2)编写实现C=A*B的函数;
编写主程序测试
#include
#include
#include
#defineMAXSIZE100/*非零元素的个数最多为100*/
/*稀疏矩阵三元组表的类型定义*/
typedefstruct
{
introw,col;/*该非零元素的行下标和列下标*/
inte;/*该非零元素的值*/
}Triple;
typedefstruct
{
Tripledata[MAXSIZE+1];/*非零元素的三元组表。
data[0]未用*/
intm,n,len;/*矩阵的行数、列数和非零元素的个数*/
}TSMatrix;
voidAddTSMatrix(TSMatrixA,TSMatrixB,TSMatrix*C)/*矩阵B和矩阵A相加*/
{
inti=0,j=0;
C->m=A.m;
C->n=A.n;
C->len=0;
while(i{
if((A.data[i].row==B.data[j].row)&&(A.data[i].col==B.data[j].col))
{
C->data[C->len].row=A.data[i].row;
C->data[C->len].col=A.data[i].col;
C->data[C->len++].e=A.data[i].e+B.data[j].e;
i++;
j++;
}
elseif((A.data[i].row==B.data[j].row)&&(A.data[i].col>B.data[j].col))
{
C->data[C->len].row=B.data[j].row;
C->data[C->len].col=B.data[j].col;
C->data[C->len++].e=B.data[j].e;
j++;
}
elseif((A.data[i].row==B.data[j].row)&&(A.data[i].col{
C->data[C->len].row=A.data[i].row;
C->data[C->len].col=A.data[i].col;
C->data[C->len++].e=A.data[i].e;
i++;
}
elseif(A.data[i].row>B.data[j].row)
{
C->data[C->len].row=B.data[j].row;
C->data[C->len].col=B.data[j].col;
C->data[C->len++].e=B.data[j].e;
j++;
}
else//if(A.data[i].row{
C->data[C->len].row=A.data[i].row;
C->data[C->len].col=A.data[i].col;
C->data[C->len++].e=A.data[i].e;
i++;
}
}
if(i==A.len&&j{
C->data[C->len].row=B.data[j].row;
C->data[C->len].col=B.data[j].col;
C->data[C->len++].e=B.data[j].e;
j++;
}
elseif(i{
C->data[C->len].row=A.data[i].row;
C->data[C->len].col=A.data[i].col;
C->data[C->len++].e=A.data[i].e;
i++;
}
}
voidShowTSMatrix(TSMatrixM)/*打印矩阵M*/
{
inti,j,dir=0;
for(i=0;i{
for(j=0;j{
if(M.data[dir].row==i&&M.data[dir].col==j)/*存在非零元*/
{
printf("%d",M.data[dir].e);
dir++;
}
else
printf("0");
}
printf("\n");
}
}
voidInitTSMatrix(TSMatrix*M)/*打印矩阵M*/
{
inti,j;
M->len=0;
for(i=0;im;i++)
{
for(j=0;jn;j++)
{
if(rand()<0.3*RAND_MAX)
{
M->data[M->len].row=i;
M->data[M->len].col=j;
M->data[M->len].e=1;
M->len++;
}
}
}
}
voidmain()
{
TSMatrixA,B,C;
A.m=5;
A.n=5;
B.m=5;
B.n=5;
srand((unsigned)time(NULL));
InitTSMatrix(&A);
printf("ThematrixAis:
\n");
ShowTSMatrix(A);
InitTSMatrix(&B);
printf("ThematrixBis:
\n");
ShowTSMatrix(B);
AddTSMatrix(A,B,&C);
printf("ThematrixCis:
\n");
ShowTSMatrix(C);
}
上机实验5:
#include
voidmain()
{
voidprint(intw);
intn;
scanf("%d",&n);
print(n);
}
voidprint(intw)
{
inti;
if(w!
=0)
{
print(w-1);
for(i=1;i<=w;++i)
printf("%3d",w);
printf("\n");
}
}