开课学院及实验室:计算机楼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",&a); while(a != 0) { s =(node*)malloc(sizeof(node)); s->data=a; r->next=s; r=s; printf("please input a data:"); scanf("%d",&a); } 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(m p=B->next; 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->data 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(index while(p&&(cx t=p; p=p->next; 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->data); 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->data); p=p->next; } D=C; //对C进行排序生成D sort(D); printf("linklist D:\\n"); q = D->next; while(q) { printf("%d\\n",q->data); q = q->next; } printf("\\nplease input 0 or 1 \\n"); //用1和0判断是按位置删除还是直接删除元素 scanf("%d",&cmd); if(cmd==0) //位置删除 { printf("please input linklist name\\n "); fflush(stdin); scanf("%c",&name); printf("\\nplease input index \\n"); scanf("%d",&indexs); 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",&name); printf("\\nplease input datas \\n"); scanf("%d",&datas); 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; } 程序正常运行,并且可以实现将两个集合合并。 |