广州大学学生实验报告
开课学院及实验室:计算机楼603B 2015年 3月 5 日
学院 数学与信息科年级、专学学院 业、班 信安141 姓名 黄俊强 学号 1415300017 实验课程名称 数据结构实验 成绩 实验项目名称 算法设计 指导老师 钟育彬 实验目的1 理解算法的定义,算法特征与算法的描述方法; 2掌握如何在C语言中利用顺序存储结构和非顺序存储结构实现简单算法; 3 熟悉抽象数据类型的表示和实现。 实验原理 数据结构主要包括三方面的内容:数据的逻辑结构、数据的存储结构和数据的运算及实现(即算法)。熟悉算法的描述与实现,对后续课程有着重要意义。 而抽象数据类型需借助固有数据类型来表示和实现,即利用高级程序设计语言中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作,具体实现细节则依赖于所用语言的功能。 问题描述 将两个长度不超过10的有序整数集合A和B合并为一个有序整数集合C。请用数组(顺序存储结构)表示这两个集合,针对这种存储结构设计算法并编程实现。 实验内容 #include #include typedef struct node //节点定义 { int data; struct node *next; } node,*linklist; linklist creat(linklist head) //该函数用来创建链表 { node *r,*s; int a; r = (linklist)malloc(sizeof(node)); head = r; scanf(\"%d\ while(a != 0) { s =(node*)malloc(sizeof(node)); s->data=a; r->next=s; r=s; printf(\"please input a data:\"); scanf(\"%d\ } r->next=NULL; return head; } linklist length(linklist l) // 返回L中数据元素个数 { int i=0; linklist p=l->next; // p指向第一个结点 while(p) { i++; p=p->next; } return i; } linklist mergel(linklist A,linklist B) //用于实现链表A,B的交叉组合 { int m,n; node *p,*q,*s,*t; linklist C; p=A->next; q=B->next; m=length(A); n=length(B); C=A; if(mnext; q=A->next; C=B; } while(p&&q) { s=p->next; p->next=q; if(s) { t=q->next; q->next=s; } p=s; q=t; } return C; } linklist sort(linklist L) //链表内容升序排列 { linklist p,q,min; int temp; p=L; while( p=p->next ) { q=min=p; while(q=q->next){ if( q->datadata ) min = q; } if( min!=p ) { temp = p->data; p->data = min->data; min->data=temp; } } return L; } linklist Delete(linklist l,int index) //删除链表指定位置元素 { linklist p,t; int cx=1; //用于计数 p=l; if(indexnext; cx++; } t->next=p->next; } else printf(\"input indext error\"); return l; } linklist Delete_element(linklist l,int data) //删除指定的元素 { linklist p; p=l; if(p->next) { while(p->next->data!=data) { p=p->next; } p->next=p->next->next; } else printf(\"don't faind the element\"); return l; } linklist display(linklist l) //打印 { linklist p; printf(\"new linklist :\\n\"); p = l->next; while(p) { printf(\"%d\\n\ p= p->next; } return l; } main() { linklist p,q,A,B,C,D; int indexs; int datas; char name; int cmd; printf(\"Creat linklist A:\\n\"); //创建A链表,并打印 printf(\"please input a data:\"); A = creat(A); printf(\"Creat linklist B:\\n\"); //创建B链表,并打印 printf(\"please input a data:\"); B = creat(B); C = mergel(A,B); //生成C链表 ,并打印 printf(\"linklist C\\n\"); p = C->next; while(p) { printf(\"%d\\n\ p=p->next; } D=C; //对C进行排序生成D sort(D); printf(\"linklist D:\\n\"); q = D->next; while(q) { printf(\"%d\\n\ q = q->next; } printf(\"\\nplease input 0 or 1 \\n\"); //用1和0判断是按位置删除还是直接删除元素 scanf(\"%d\ if(cmd==0) //位置删除 { printf(\"please input linklist name\\n \"); fflush(stdin); scanf(\"%c\ printf(\"\\nplease input index \\n\"); scanf(\"%d\ fflush(stdin); if(name=='A') { Delete(A,indexs); display(A); } else if(name=='B') { Delete(B,indexs); display(B); } else if(name=='C') { Delete(C,indexs); display(C); } else if(name=='D') { Delete(D,indexs); display(D); } else printf(\"nameError\"); } else if(cmd==1) //元素删除 { fflush(stdin); //清除缓冲 printf(\"please input linklist name\\n \"); //fflush(stdin); scanf(\"%c\ printf(\"\\nplease input datas \\n\"); scanf(\"%d\ if(name=='A') { Delete_element(A,datas); display(A); } else if(name=='B') { Delete_element(B,datas); display(B); } else if(name=='C') { Delete_element(C,datas); display(C); } else if(name=='D') { Delete_element(D,datas); display(D); } else printf(\"name2error\"); } else printf(\"cmdError\"); printf(\"\\nOver\\n\"); getchar(); return 0; } 程序正常运行,并且可以实现将两个集合合并。