数据结构报告.docx
- 文档编号:8018253
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:34
- 大小:241.02KB
数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(34页珍藏版)》请在冰豆网上搜索。
数据结构报告
数据结构
实验报告
学号:
姓名:
提交日期:
成绩:
东北大学秦皇岛分校电子信息系
【实验编号】
实验一
【实验名称】
线性表的应用
【实验内容】
一,实验目的:
掌握线性表的逻辑结构定义、线性表的两种存储结构(顺序和链式);
掌握顺序表和链表的定义及基本操作,运用其解决一些实际问题。
二,实验题目:
1、请编写26个字母按特定字母值插入或删除的完整程序,可自行选用顺序存储或链表结构。
源程序代码:
#include
*/
#include
typedefstructliuyu{chardata;structliuyu*link;}test;
liuyu*p,*q,*r,*head;
intL;/*元素的个数*/
intm=sizeof(test);
voidbuild();/*主函数中会被调用的函数应当预先说明*/
voiddisplay();
intinsert_char(char,char);/*插入一个字母,在第字母Y之前,若无字母则加到末尾*/
intdelet_char(char);/*删除元素X,注意保存X的前趋元素指针!
*/
/*---------------------------------------------------------*/
voidbuild()/*字母链表的生成*/
{inti;
head=(test*)malloc(m);/*m=sizeof(test);*/
p=head;
for(i=1;i {p->data=i+'a'-1;/*'a'也可用其ASCII码97来表示*/ p->link=(test*)malloc(m);/*m=sizeof(test));*/ p=p->link;} p->data=i+'a'-1; p->link=NULL; } /*---------------------------------------------------------*/ voiddisplay()/*字母链表的输出*/ {p=head; while(p->link! =NULL) {printf("%c",p->data); p=p->link;} printf("%c\n",p->data); } /*---------------------------------------------------------*/ intinsert_char(charX,charY)/*插入一个字母X在某个字母Y之前,若找不到Y字母则加到末尾*/ {p=head; r=(test*)malloc(m); r->data=X; if(head->data==Y) {head=r; r->link=p;} else{while((p->data! =Y)&&(p->link! =NULL)){q=p;p=p->link;} if(p->data==Y){q->link=r;r->link=p;} else{p->link=r;r->link=NULL;} } L++; return(0); } /*---------------------------------------------------------*/ intdelet_char(charX)/*删除元素X,注意保存X的前趋元素指针! */ {p=head; if(head->data==X){head=head->link;free(p);} else{while((p->data! =X)&&(p->link! =NULL)) {q=p; p=p->link;} if(p->data==X) {q->link=p->link; free(p);} elsereturn(-1); } L--; return(0); } /*---------------------------------------------------------*/ voidmain(void)/*字母线性表的生成和输出*/ {L=26; build(); display(); printf("insertreturnvalue=%d\n",insert_char('L','W')); display(); printf("deletereturnvalue=%d\n",delet_char('z')); display(); } 运行结果: 1.2创建一个链表: 程序代码如下: #include"conio.h" #include"stdio.h" #include"stdlib.h" structlist { intdata; structlist*next; }; typedefstructlistnode; typedefnode*link; voidmain() { linkptr,head; intnum,i; ptr=(link)malloc(sizeof(node)); head=ptr; printf("pleaseinput5numbers: \n"); for(i=0;i<5;i++) { scanf("%d",&ptr->data); ptr->next=(link)malloc(sizeof(node)); if(i==4) ptr->next=NULL; elseptr=ptr->next; } ptr=head; while(ptr! =NULL) { printf("Thevalueis=%d\n",ptr->data); ptr=ptr->next; } getch(); } 运行结果为: 3、反向输出一个链表。 程序源代码: /*reverseoutputalist*/ #include"stdlib.h" #include"stdio.h" structlist {intdata; structlist*next; }; typedefstructlistnode; typedefnode*link; voidmain() {linkptr,head,tail; intnum,i; tail=(link)malloc(sizeof(node)); tail->next=NULL; ptr=tail; printf("\npleaseinput5data==>\n"); for(i=0;i<=4;i++) { scanf("%d",&num); ptr->data=num; head=(link)malloc(sizeof(node)); head->next=ptr; ptr=head; } ptr=ptr->next; while(ptr! =NULL) {printf("Thevalueis==>%d\n",ptr->data); ptr=ptr->next; }} 运行结果: 【实验编号】 实验二 【实验名称】 栈和队列的应用 【实验内容】 [实验目的]: 掌握栈和队列的结构定义和特性; 掌握栈和队列的基本操作以及栈和队列在程序设计中的应用。 [实验题目]: 1.栈实现数制转换 #include #include typedefintStatus; typedefintSElemType; #defineOK1 #defineERROR0 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 structSTACK { SElemType*base; SElemType*top; intstacksize; }; typedefstructSTACKSqStack; typedefstructSTACK*pSqStack; StatusInitStack(SqStack**S) { (*S)=(SqStack*)malloc(sizeof(SqStack)); (*S)->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(! (*S)->base) returnERROR; (*S)->top=(*S)->base; (*S)->stacksize=STACK_INIT_SIZE; returnOK; } StatusStackEmpty(SqStackS) { if(S.top==S.base)returnOK; else returnERROR; } StatusPush(SqStack*S,SElemTypee) { if(S->top-S->base>=S->stacksize) { S->base=(SElemType*)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(! S->base) returnERROR; S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *(S->top++)=e; returnOK; } StatusPop(SqStack*S,SElemType*e) { if(S->top==S->base)returnERROR; *e=*(--(S->top)); returnOK; } Statusvisit(SElemType*e) { printf("%d",*e); returnOK; } voidconversion() { pSqStackS; SElemTypee; intn; InitStack(&S); printf("InputanumbertoconverttoOCT: \n"); scanf("%d",&n); if(n<0) { printf("\nThenumbermustbeover0."); return; } if(n==0)Push(S,0); else { Push(S,n%8); n=n/8; } printf("theresultis: "); while(! StackEmpty(*S)){ Pop(S,&e); printf("%d",e); } } voidmain() { printf("\n\n\n\n"); conversion(); printf("\n\nWelcometovisit! "); } 运行结果: 【实验编号】 实验三 【实验名称】 串的应用 【实验内容】 [实验目的]: 掌握串的数据类型定义,串的存储结构; 掌握串的基本操作的实现和应用。 [实验题目]: 3.1编写一个实现串的置换操作Replace(&S,T,V)的算法。 代码如下: #include #include #include intindex(char*s,char*t,intpos,intsl,inttl);//从主串s的第pos个字符开始查找子串t,函数结果是子串t在主串s的pos开始之后首次出现的位置 voidreplace(char*s,char*t,char*v);//串的置换,将主串s中的t串,置换为v串 main() { char*s,*t,*v; s=(char*)malloc(100); t=(char*)malloc(100); v=(char*)malloc(100); printf("输入字符串s: "); gets(s); printf("输入要在字符串s查找的子串t: "); gets(t); printf("输入要置换的字符串v: "); gets(v); replace(s,t,v);//调用串置换函数 printf("输出替换后的新字符串: %s\n",s); } voidreplace(char*s,char*t,char*v)//串的置换,将主串s中的t串,置换为v串 { inti,j,k=1,po,sl,tl,p; sl=strlen(s); tl=strlen(t); po=1; k=index(s,t,po,sl,tl); if(k==0) return; i=k-1; if(strlen(v)==tl)//替换串的长度和子串的长度相等时 for(j=0;j<=tl-1;j++) s[i++]=v[j]; if(strlen(v)! =tl)//替换串的长度和子串的长度不相等时,借助第三个数组t完成操作 { for(j=0;j t[j]=s[j]; for(p=0;p t[j++]=v[p]; for(p=k+tl-1;p t[j++]=s[p]; t[j]='\0'; sl=strlen(t); for(i=0;i s[i]=t[i]; s[i]='\0'; } } intindex(char*s,char*t,intpos,intsl,inttl)//从主串s的第pos个字符开始查找子串t,函数结果是子串t在主串s的pos开始之后首次出现的位置 { inti,j; i=pos; j=1; while(i<=sl&&j<=tl) if(s[i-1]==t[j-1]) { i++; j++; } else {i=i-j+2; j=1; } if(j>tl) return(i-tl);//返回位置 else return(0); } 运行结果: 【实验编号】 实验四 【实验名称】 数组 【实验内容】 [实验目的]: 掌握数组的定义和实现,加深对数组的类型理解。 掌握数组的存储结构和访问方式。 掌握特殊矩阵的存储方法。 [实验题目]: 假设稀疏矩阵A和B均以三元组表作为存储结构。 试写出矩阵相加的算法,另设三元组C存放结果矩阵。 #include #defineMAXSIZE100 typedefstruct { introw,col; inte; }Triple; typedefstruct { Tripledata[MAXSIZE+1]; intm,n,len; }TSMatrix; voidInput(TSMatrix*pA) { intnrow,ncol,num,elem,i; printf("请输入矩阵的行数,列数和非零元素个数: "); scanf("%d%d%d",&nrow,&ncol,&num); pA->m=nrow; pA->n=ncol; pA->len=num; for(i=1;i<=num;i++) { printf("请输入第%d个元素的行号、列号和元素值: ",i); scanf("%d%d%d",&nrow,&ncol,&elem); pA->data[i].row=nrow; pA->data[i].col=ncol; pA->data[i].e=elem; } } voidPrint(TSMatrix*pA) { inti,j,t; for(i=1,t=1;i<=pA->m;i++) {for(j=1;j<=pA->n;j++) { if(pA->data[t].row==i&&pA->data[t].col==j) { printf("%4d",pA->data[t].e); t++; } else printf("%4d",0); } printf("\n"); } } voidAdd(TSMatrix*pA,TSMatrix*pB,TSMatrix*pC) { inti,j,t; if(pA->m! =pB->m||pA->n! =pB->n) { printf("两个矩阵的行数与列数不相等,不能相加! \n"); return;/*111111*/ } pC->m=pA->m; pC->n=pA->n; i=1; j=1; t=0; while(i<=pA->len&&j<=pB->len) { if(((pA->data[i].row-1)*pA->n+pA->data[i].col-1)<((pB->data[j].row-1)*pB->n+pB->data[j].col-1)) { t++; pC->data[t].row=pA->data[i].row; pC->data[t].col=pA->data[i].col; pC->data[t].e=pA->data[i].e; i++; } else if(((pA->data[i].row-1)*pA->n+pA->data[i].col-1)>((pB->data[j].row-1)*pB->n+pB->data[j].col-1)) { t++; pC->data[t].row=pB->data[i].row; pC->data[t].col=pB->data[i].col; pC->data[t].e=pB->data[i].e; j++; } else if(pA->data[i].e+pB->data[j].e! =0) { t++; pC->data[t].row=pA->data[i].row; pC->data[t].col=pA->data[i].col; pC->data[t].e=pA->data[i].e+pB->data[j].e; i++; j++; } } while(i<=pA->len) { t++; pC->data[t].row=pA->data[i].row; pC->data[t].col=pA->data[i].col; pC->data[t].e=pA->data[i].e; i++; } while(j<=pB->len) { t++; pC->data[t].row=pB->data[i].row; pC->data[t].col=pB->data[i].col; pC->data[t].e=pB->data[i].e; j++; } pC->len=t; } voidmain() { TSMatrixA,B,C; Input(&A); Print(&A); Input(&B); Print(&B); Add(&A,&B,&C); Print(&C); } 运行结果: 【实验编号】 实验五 【实验名称】 二叉树的应用 【实验内容】 [实验目的]: 掌握二叉树的性质和存储结构; 掌握二叉树的遍历和线索化及其应用; 掌握哈夫曼树的应用。 [实验题目]: 生成如下二叉树,并得出三种遍历结果: #include"stdio.h" #include"stdlib.h" #include"conio.h" #defineERROR0; #defineOK1; typedefintElemType; typedefstructBinaryTree{ ElemTypedata; structBinaryTree*l; structBinaryTree*r; }*BiTree,BiNode; BiNode*New(){ return((BiNode*)malloc(sizeof(BiNode))); } intCreateSubTree(BiTree*T,ElemType*all,inti){ if(all[i]==0||i>16){ *T=NULL; returnOK; } *T=New(); if(*T==NULL)returnERROR; (*T)->data=all[i]; CreateSubTree(&((*T)->l),all,2*i); CreateSubTree(&((*T)->r),all,2*i+1); } voidCreateBiTree(BiTree*T){ ElemTypeall[16]={0,1,2,3,0,0,4,5,0,0,0,0,6,0,0,0}; CreateSubTree(T,all,1); } intprintelem(ElemTyped){ printf("%d",d); returnOK; } intPreOrderTraverse(BiTreeT,int(*Visit)(ElemTyped)){ if(T){ if(Visit(T->data)) if(PreOrderTraverse(T->l,Visit)) if(PreOrderTraverse(T->r,Visit))returnOK; returnERROR; } elsereturnOK; } intInOrderTraverse(BiTreeT,int(*Visit)(ElemTyped)){ if(T){ if(PreOrderTrave
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)