中国地质大学数据结构实习报告.docx
- 文档编号:10351943
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:28
- 大小:173.05KB
中国地质大学数据结构实习报告.docx
《中国地质大学数据结构实习报告.docx》由会员分享,可在线阅读,更多相关《中国地质大学数据结构实习报告.docx(28页珍藏版)》请在冰豆网上搜索。
中国地质大学数据结构实习报告
PracticeReportforDataStructuresandAlgorithmAnalysis
DataStructuresCourseReport
Candidate:
StudentNumber:
Major:
CommunicationEngineering
Supervisor:
Wurangzhong
ChinaUniversityofGeosciences(Wuhan)
Wuhan,Hubei430074,P.R.China
May18,2013
ChinaUniversityofGeosciences,FacultyofMechanicsandElectronicInformation
线性表的实现
1.用链表实现线性表
这些是程序中一些子程序的声明,用它们来创建链表,并完成插入、删除、查找元素等操作,并且可以按照元素位置或者元素大小来进行这些操作。
pNodeCreateLinkLists();
voidPrintLists(pNodeL);
voidInsertRear(pNodeL);
voidInsertHead(pNodeL);
voidInsertkTh(pNodeL,intposition,ElemTypex);
intGetLength(pNodeL);
pNodeFind(ElemTypex,pNodeL);
pNodeFindPrevoius(ElemTypex,pNodeL);
intIsEmpty(pNodeL);
intIsLast(pNodeP,pNodeL);
voidDelete(ElemTypex,pNodeL);
voidDeletekTh(intposition,pNodeL);
voidDeleteList(pNodeL);
插入程序代码
voidInsertkTh(pNodeL,intposition,ElemTypex)
{
inti;
pNodeTmpNode,Tmp=L;
TmpNode=(pNode)malloc(sizeof(structNode));
TmpNode->data=x;
TmpNode->next=NULL;
for(i=0;i { if(Tmp->next==NULL) { printf("Theinsertionpositionisinvalid! \n"); return; } else Tmp=Tmp->next; } TmpNode->next=Tmp->next; Tmp->next=TmpNode; } 删除程序代码 voidDeletekTh(intposition,pNodeL) { pNodeTmp=L,TmpPre=NULL; inti=0; for(i=0;i { if(Tmp->next! =NULL) { TmpPre=Tmp; Tmp=Tmp->next; } elseif(Tmp->next==NULL&&i { printf("TheDeletionpositionisinvalid! \n"); return; } } TmpPre->next=Tmp->next; free(Tmp); } 这是程序主函数,以此来完成以上子函数的功能 #include #include #include"lianbiao.h" intmain() { inti,x,position;pNodem; pNodeLinkLists; { printf("输入元素来建立链表,0为结束输入的标志"); LinkLists=CreateLinkLists(); printf("链表为: "); PrintLists(LinkLists); } printf("选择你需要的操作,输入序号: \n"); printf("1.建立一个链表\n"); printf("2.输出链表\n"); printf("3.插入一个元素到链表中\n"); printf("4.查找链表中的元素\n"); printf("5.删除链表中的元素\n"); printf("6.清空链表\n"); scanf("%d",&i); switch(i) {case1: { printf("输入元素来建立链表,0为结束输入的标志"); LinkLists=CreateLinkLists(); printf("链表为: "); PrintLists(LinkLists); } case2: {PrintLists(LinkLists);break;} case3: { printf("依次输入插入的位置和元素"); scanf("%d",&position); scanf("%d",&x); InsertkTh(LinkLists,intposition,ElemTypex); break;} case4: { printf("输入要查找的元素"); scanf("%d",&x); m=Find(ElemTypex,LinkLists); printf("%d",m); break;} case5: { printf("输入要删除的元素的位置"); scanf("%d",&position); DeletekTh(intposition,LinkLists); break;} case6: {DeleteList(LinkLists);break;} } } 2.数组实现线性表 用数组实现的功能和用链表表示的相同 部分子函数如下 //初始化顺序表: 给出初始化长度 intinitialArray(arrayListarrLst,intlen) { arrLst->length=0; arrLst->size=len; arrLst->Array=(ElemType*)malloc(len*sizeof(ElemType)); if(arrlst->Array==NULL) return0; else return1; } //删除顺序表 voiddeleteArray(arrayListarrLst) { arrLst->length=0; arrLst->size=0; free(arrLst->Array); arrLst->Array=NULL; } //清空顺序表 voidclearArray(arrayListarrLst) { arrLst->length=0; } //判断是否为空 intis_empty(arrayListarrLst) { if(0==arrLst->length) { printf("thearrayListisempty! \n"); return1; } else { printf("thearrayListisnotempty! \n"); return0; } } //求有多少个元素 intarrayLength(arrayListarrLst) { returnarrLst->length; } //取出某个元素 intgetElem(arrayListarrLst,intindex,ElemTypee) { if(index<0||index>arrayLength(arrLst)-1) return0; else { e=arrLst->Array[index]; return1;} } //遍历顺序表,并打印 voidprintArray(arrayListarrLst) { inti; printf("arrayelementsare: "); for(i=0;i { printf("%d\t",arrLst->Array[i]); } printf("\n"); } //判断某个元素的位置 intlocateElem(arrayListarrLst,ElemTypee) { inti; for(i=0;i { if(e==arrLst->Array[i]) returni; } return-1; } 堆栈 主要是实现元素的进栈、出栈、判断栈中元素个数 堆栈的源函数 #include #include #include"duizhan.h" STACKCreatStack() { STACKS; S=(STACK)malloc(sizeof(structStack)); if(S==NULL) { printf("无法建立堆栈! "); return0; } S->top=-1; returnS; } intIsFull(STACKS) { return(S->top==MAX-1); } intIsEmpty(STACKS) { return(S->top==-1); } voidPush(ElemTypeX,STACKS) { if(IsFull(S)) {printf("堆栈已满,元素无法进栈\n"); } else { S->top++; S->data[S->top]=X; } } voidPop(STACKS) { if(IsEmpty(S)) printf("堆栈为空,元素无法出栈\n"); else S->top--; } ElemTypeTop(STACKS) { if(! IsEmpty(S)) returnS->data[S->top]; else printf("堆栈为空! \n"); } intDisposeStack(STACKS) { if(S==NULL) return0; else { free(S); printf("堆栈已成功清空! \n"); return1; } } intStackLen(STACKS) { if(! IsEmpty(S)) returnS->top; else return0; } 堆栈的主函数 #include #include #include"duizhan.h" voidmain() { STACKliliS; liliS=CreatStack(); Push(1,liliS); Push(2,liliS); Push(3,liliS); Pop(liliS); Pop(liliS); DisposeStack(liliS); } 设置断点可以看到栈中的元素 模式匹配 这是模式匹配原函数,采用了KMP方式进行匹配 #include #include"moshipipei.h" intIndexKMP(STRING*S,STRING*T,intnext[]) { inti=0; intj=0; while(i { if(j==-1||S->p_str[i]==T->p_str[j]) { ++i;++j; } else j=next[j]; } if(j==T->length) returni-T->length+1; elsereturn0; } voidGetNext(STRING*P,intnext[]) { inti=0; next[0]=-1; intj=-1; while(i { if(j==-1||P->p_str[i]==P->p_str[j]) { ++i;++j; next[i]=j; } elsej=next[j]; } } #include #include #include #include"moshipipei.h" 主函数 voidmain() { STRING*Str,*Pat; intposition=0; Str=(STRING*)malloc(sizeof(STRING)); Pat=(STRING*)malloc(sizeof(STRING)); charS_str[20]="ababcabcacbab"; charP_str[20]="abcac"; Str->p_str=S_str; Str->length=strlen(S_str); Pat->p_str=P_str; Pat->length=strlen(P_str); int*next=(int*)malloc(sizeof(int)*(Pat->length+1)); GetNext(Pat,next); position=IndexKMP(Str,Pat,next); printf("%d\n",position); } 显示两个字符串是在第6个元素开匹配的。 稀疏矩阵 TSMatrixNewMatrix(intm,intn){ //新建一个三元组表示的稀疏矩阵 TSMatrixM; M.mu=m; M.nu=n; M.tu=0; returnM; } 向三元组表内插入矩阵元素 StatusInsertElem(TSMatrix*M,introw,intcol,ElemTypee){ //在三元组表示的稀疏矩阵M,第row行,第col列位置插入元素e //插入成功,返回OK,否则返回ERROR inti,t,p; if(M->tu>=MAXSIZE){//当前三元组表已满 printf("\nError: Thereisnospaceinthematrix;\n"); returnERROR; } if(row>M->mu||col>M->nu||row<1||col<1){//插入位置越界,不在1~mu或1~nu之间 printf("\nError: Insertpositionisbeyondthearrange.\n"); returnERROR; } p=1;//标志新元素应该插入的位置 if(M->tu==0){//插入前矩阵M没有非零元素 M->data[p].i=row; M->data[p].j=col; M->data[p].e=e; M->tu++; returnOK; } for(t=1;t<=M->tu;t++)//寻找合适的插入位置 if((row>=M->data[t].i)&&(col>=M->data[t].j)) p++; if(row==M->data[t-1].i&&col==M->data[t-1].j){//插入前,该元素已经存在 M->data[t-1].e=e; returnOK; } for(i=M->tu;i>=p;i--){//移动p之后的元素 M->data[i+1].i=M->data[i].i; M->data[i+1].j=M->data[i].j; M->data[i+1].e=M->data[i].e; } //插入新元素 M->data[p].i=row; M->data[p].j=col; M->data[p].e=e; M->tu++; returnOK; } 稀疏矩阵的的转置 StatusTransposeSMatrix(constTSMatrix*M,TSMatrix*T){ intcol,p,q; T->mu=M->nu;T->nu=M->mu;T->tu=M->tu; if(T->tu){ q=1; for(col=1;col<=M->mu;col++) for(p=1;p<=M->tu;p++) if(M->data[p].j==col){ T->data[q].i=M->data[p].j; T->data[q].j=M->data[p].i; T->data[q].e=M->data[p].e; q++; } } returnOK; } 稀疏矩阵的乘法 StatusMultSMatrix(constTSMatrix*M,constTSMatrix*T,TSMatrix*Q){ inti,j,k,p; ElemTypem,t,s; if(M->nu! =T->mu){ printf("Sorry,thesetwomatricecan'tmultiply.\n"); returnERROR; } Q->mu=M->mu;Q->nu=T->nu;Q->tu=0; p=1; for(i=1;i<=Q->mu;i++){ for(j=1;j<=Q->nu;j++){ s=0; for(k=1;k<=M->nu;k++){ if(FALSE==FindElem(M,i,k,&m)) continue; if(FALSE==FindElem(T,k,j,&t)) continue; s+=m*t; } if(s! =0){//Q[i][j]非零 Q->data[p].i=i; Q->data[p].j=j; Q->data[p].e=s; p++; Q->tu++; } } } returnOK; } 查找 采用的是快速查找法 源程序 #include #include"chazhao.h" intSequenceSearch(intarray[],intn,intx) { inti=0; while(i =x) i++; if(i==n) return-1; else returni; } 建立一个数组后查找元素,输入元素后,返回元素所在数组的下标。 排序 采用的是冒泡法排序 源程序 #include #include"paixu.h" voidBubbleSort(intarray[],intn) { inti=0; intj=0; inttemp=0; intflag=0; for(i=0;i { flag=0; for(j=n-1;j>i;j--) { if(array[j] { temp=array[j]; array[j]=array[j-1]; array[j-1]=temp; flag=1; } } if(flag==0) break; } } voidPrintArray(intarray[],intn) { inti; for(i=0;i printf("%d",array[i]); printf("\n"); } 用数组储存数据,在用冒泡法排序后将排序好的数组输出。 AVL树 程序主要是在向二叉树插入节点后,最终生成AVL树 AVL树中的单旋转 staticPositionSRL(PositionK2) { PositionK1=NULL; K1=K2->left; K2->left=K1->right; K1->right=K2; K2->height=MAX(Height(K2->left),Height(K2->right))+1; K1->height=MAX(Height(K1->left),Height(K2))+1; returnK1; } staticPositionSRR(PositionK2) { PositionK1=NULL; K1=K2->right; K2->right=K1->left; K1->left=K2; K2->height=MAX(Height(K2->left),Height(K2->right))+1; K1->height=MAX(Height(K2),Height(K1->right))+1; returnK1; } AVL树中的双旋转 staticPositionDRL(PositionK3) { #if0 K3->left=SRR(K3->left); returnSRL(K3); #else PositionK1=NULL; PositionK2=NULL; K1=K3->left; K2=K1->right; K1->right=K2->left; K2->left=K1; K3->left=K2->right; K2->right=K3; returnK2; #
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国地质大学 数据结构 实习 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)