数据结构链式顺序表二进制素数相同数整除

  • 格式:doc
  • 大小:902.00 KB
  • 文档页数:28

华南农业大学理学院课程论文(设计)2011-2012学年第2学期课程名称:数据结构课程设计课程性质:实践课专业班级:10级信息与计算科学2 班考核方式:考查学生姓名:王志远学号:201030760230学时:1周教师姓名:聂笃宪自评分:95 评语及评分目录:1、课程设计内容 (4)2、程序实现的基本思想 (4)3、系统流程图 (5)4、系统运行效果图 (7)5、总结 (13)6、参考文献 (13)1、课程设计内容1.1、题目利用随机函数产生两列(每列个数均为150且每个数均不小于10) 的随整数,对这两列整数写一个程序实现如下功能操作:1)两列整数在顺序存储方式中,a)找出这两列数中的素数b) 把两列数中相同的数转化为二进制数输出。

2)两列整数在链表存储方式中,a)统计两链表中相同元素的个数;b)合并这两个链表为一个;c)分别删除第一链表中能被2整除的结点和第二个链表中能被3整除的结点。

1.2、要求1)利用随机函数产生两两列随机整数;2)将两列随机整数分别存储在顺序存储结构和链式存储结构中;3)分别实现顺序表和链式表进行题目要求的如找素数、统计数字、合并链表等操作。

4)打印显示2、程序实现的基本思想2.1、问题的分析1)按照题目要求输入函数所要求函数上限,本程序随机数声明为int2)顺序存储结构中调用InitList、ListInsert来生成顺序表,对顺序表进行Searchlist_prime函数调用(查找素数);Search_Same 函数调用(查找相同数),同时这个函数调用Pop、Push等栈相关函数进行二进制转换。

3)链式存储结构中调用InitList、ListInsert来生成链表,对链表实现MergeList(合并)、Search_Delete(查找并删除)、LinkSearch_Same(统计相同结点数)等操作。

2.2、测试计划3、系统流程图3.1、函数调用流程3.2、总程序运行流程图4、系统运行效果图1)、系统进入界面2)、题目及输入上限值3)进入选择操作顺序表链式表操作界面4)生成顺序表a、找出素数;b、找出相同数并转化为二进制。

5)、生成链式随机数a、随机数中相同结点及个数b、合并链表c、整除5、总结通过这次课程设计,我深感作为一个程序员不容易。

在学习时由于没有留意,造成在编程时发现很多问题,例如在函数调用,指针运用等方面遇到比较大的麻烦。

为了解决这些问题,我认真复习了课本,逐个问题逐步解决。

在复习课本时对课本的知识点重新梳理一遍,使自己的基础得到巩固。

在编程中遇到不少的问题,而这些问题大部分是小问题,正因为是“小”,难发现,且导致进度停滞不前,因此,必须在编写程序时,加倍认真细心,细心写每一条语句,细心分析循环的过程,认真查看每一条语句,这样才能减少问题的出错及大大加快进度。

虽然系统实现了基本的功能,程序中还有不少问题存在,还有很多功能没有实现,需逐步加强,更需多学习,多练习,多复习,力求熟练地编写更好的程序,让这成为自己的专长。

6、参考文献[1]谭浩强, C程序设计, 北京, 清华大学出版社, 2005[2]严蔚敏吴伟民,数据结构(C语言版),清华大学出版社,2007[3]梁作娟胡伟唐瑞春,数据结构(习题解答与考试指导),清华大学出版社,2004[4]张世和徐继延,数据结构习题解析与实训,清华大学出版社,2008#include<stdio.h>#include<malloc.h>#include <string.h>#include<conio.h>#include<stdlib.h>#include <time.h>#define MINNUMBER 10#define LIST_INT_SIZE 150#define LISTINCREMENT 10#define MAXSIZE 200#define OVERFLOW -2#define OK 1#define ERROR 0typedef int ElemType;typedef int SElemType;typedef int Status;/*************************************顺序表函数*******************************/typedef struct{ElemType *elem;int length;int listsize;ElemType *base;ElemType *top;}SqList;Status InitList(SqList &L){L.elem=(ElemType*)malloc(LIST_INT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW);L.length=0;L.listsize=LIST_INT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e){ElemType *q,*p;if(i<1||i>L.length+1)return ERROR;q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]) ;p>=q;q--){*(p+1)=*p;}L.elem[i-1]=e;L.length++;return OK;}void Searchlist_prime(SqList &L,ElemType &e){int dividend;dividend=e;int j,t;t=1;{for(j=2;j<=(dividend/2);j++)if(dividend%j==0)t=0;if(t==1)printf("%d\t",dividend); }}//素数算法Status InitStack(SqList &S){S.base=(ElemType *)malloc(LIST_INT_SIZE*sizeof(ElemType));if(!S.base) exit(OVERFLOW);S.top=S.base;S.listsize=LIST_INT_SIZE;return OK;}Status Push(SqList &S,ElemType e){if(S.top-S.base>=S.listsize){S.base=(ElemType*)realloc(S.base,(S.listsize+LISTINCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.listsize;S.listsize+=LISTINCREMENT;}*S.top++=e;return OK;}Status Pop(SqList &S, ElemType &e){if(S.top==S.base) return ERROR;e=*--S.top;return OK;}Status StackEmpty(SqList S){if(S.base!=S.top)return 0;elsereturn 1;}void Search_Same(SqList &La,SqList &Lb){ //本函数调用pop‘push函数int i,j,e;SqList A;for(i=0;i<La.length;i++){for(j=0;j<Lb.length;j++ ){if(La.elem[i]==Lb.elem[j]){printf("%d ",La.elem[i]);InitStack(A);while(La.elem[i]){Push(A,La.elem[i]%2);La.elem[i]=La.elem[i]/2;}while(!StackEmpty(A)){Pop(A,e);printf("%d",e);}printf("\t");break;}}}} //寻找两列相同数/******************************链表函数*****************************************/typedef struct LNode{SElemType data;struct LNode *next;}Linklist;Status InitList(Linklist *&L){L=(Linklist*)malloc(sizeof(Linklist));L->next=NULL;return OK;}Status ListInsert(Linklist *&L,int i,SElemType e){Linklist* p=L ,*s;int k=0;while(k<i-1&&p!=NULL){k++;p=p->next;}if(p==NULL)return 0;else{s=(Linklist *)malloc(sizeof(Linklist));s->data=e;s->next=p->next;p->next=s;return 1;}}Status ListDelete(Linklist *&L,int i, SElemType &e){ int j=0;Linklist *p=L,*q;while(p->next&&j<i-1){p=p->next;++j;};if(!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}Status DispList(Linklist *L){Linklist *p; int i;p=L->next;while(p!=NULL){printf("%d->",p->data);p=p->next;}return OK;}Status MergeList(Linklist *La,Linklist *Lb,Linklist *Lc){ Linklist *pa,*pb,*pc;pa=La->next; pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);DispList(Lc);return OK;}Status Search_Delete(Linklist *L,int i){Linklist *p,*q;int e;p=L;q=p->next;while(q){if(q->data%i!=0){q=q->next;p=p->next;}else{p->next=q->next;e=q->data;free(q);q=p->next;}}return OK;}Status LinkSearch_Same(Linklist *La,Linklist *Lb){int i,j,count=0;Linklist *pa,*pb;int tem[150];pa=La->next;pb=Lb->next;while(pa){while(pb){if(pa->data==pb->data){//tem[i]=pa->data;count+=1;printf("%d ",pa->data);break;}elsepb=pb->next;}pa=pa->next;pb=Lb->next;}printf(" 》\n统计个数(↖(^ω^)↗):%d",count);return OK;}/**************************主函数**********************************************/int Display(){int SupLimit, i,j,m,k,n,r1[LIST_INT_SIZE],r2[LIST_INT_SIZE]; char num[MAXSIZE];SqList L,Q;Linklist *S,*P,*M;time_t t;char GoOn;printf("\n");/************************生成随机数**********************/srand((unsigned) time(&t));printf("\n");printf(" ㊣请输入随机数的上限整数值(下限值为10):" );scanf("%d",&SupLimit);while(SupLimit<=10){printf("\n 你输入的数字不符合规定,请从新输入:");scanf("%d",&SupLimit);}getchar();for (i=0; i<LIST_INT_SIZE; i++) {r1[i]=rand()%(SupLimit-MINNUMBER)+MINNUMBER;//第一组随机数}for (j=0; j<LIST_INT_SIZE; j++) {r2[j]=rand()%(SupLimit-MINNUMBER)+MINNUMBER;//第二组随机数}/******************第一问:随机数加入顺序表存储*******************/while(1){printf(" ▆▆▆▆▆▆▆▆▆请选择操作方式▆▆▆▆▆▆▆▆▆▆▆\n\n");printf(" ①输入<1>顺序表操作\n");printf(" ②输入<2>为链表操作\n");printf(" ③输入<3>为返回系统界面\n");printf(" ④输入<0>为退出操作\n");printf("\n ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆\n\n");printf("\n");printf(" →请输入操作<1> or <2> or<3> or <0>:");while(1){gets(num);if(strcmp(num,"1")==0||strcmp(num,"2")==0||strcmp(num,"0")==0||strcmp(num,"3")==0) break;elseprintf("\n你输入的数字有错,请重新输入:");}switch(num[0]){case '1':printf("\n");printf("1、生成两列顺序储存的随机数(按ENTER显示)\n");getchar();printf("第一列随机数为: 第二列随机数为: \n");InitList(L);InitList(Q);for(m=1;m<=L.listsize;m++){ListInsert(L,m,r1[m-1]); printf(" %2d \t ",L.elem[m-1]);printf(" |*| ");ListInsert(Q,m,r2[m-1]); printf(" %2d",Q.elem[m-1]);//随机数加入顺序表存储printf("\n");}printf("第一组共有随机数:%d\t",L.length );printf("\t 第二组共有随机数:%d",Q.length );/*******************取其中素数******************************/ printf("\n");printf("\n");printf("1.a)、找出这两列中素数(按ENTER显示)\n");getchar();printf(" 第一列中素数为:\n");for(k=1;k<=L.listsize;k++){Searchlist_prime(L,r1[k-1]);}printf("\n");printf(" 第二列中素数为:\n");for(n=1;n<=L.listsize;n++){Searchlist_prime(L,r2[n-1]);}/*******************转二进制******************/printf("\n");printf("1.b)、找出这两列中相同数并转为二进制(按ENTER显示)\n");printf("\n");getchar();printf(" (⊙_⊙) 温馨提示:左边为十进制数,右边为二进制数(⊙_⊙)\n");Search_Same(L,Q);printf("\n");break;case '2':/*****************第二问:生成随机数加入链式存储********************/ printf("\n");printf("2、生成两列链式储存的随机数(按ENTER显示)");getchar();InitList(S); InitList(P);InitList(M);for(m=1;m<=L.listsize;m++) {ListInsert(S,m,r1[m-1]);ListInsert(P,m,r2[m-1]);}printf(" 第一组链式储存随机数\n");DispList(S);printf("\n");printf("\n");printf(" 第二组链式储存随机数\n");DispList(P);printf("\n");/*************相同结点个数***************/printf("\n2.a)、两链表中相同的结点及个数为:(按ENTER显示)");getchar();printf("《");LinkSearch_Same(S,P);printf("\n\n");printf("2.b)、合并的链式列表为(按ENTER显示):\n");getchar();MergeList(S,P,M);/*************整除***************/printf("\n\n");printf("\n 2.c).1、链表一删除能被2整除的结点后的链表为(按ENTER显示)\n"); getchar();InitList(S); InitList(P);for(m=1;m<=L.listsize;m++) {ListInsert(S,m,r1[m-1]);ListInsert(P,m,r2[m-1]);}Search_Delete(S,2);DispList(S);printf("\n ");printf("\n 2.c).2、链表二删除能被3整除的结点后的链表为(按ENTER显示)\n");getchar();Search_Delete(P,3);DispList(P);break;case '0':exit(1);break;case'3':int main();system("cls");main();printf("\n\n");break;}printf("\n\n 制作人:王志远\n 班级:10信息与计算科学2班\n 学号:201030760230\n 邮箱:dream.yying@\n");printf("\n**********************演示完毕,祝大家学习顺利!生活愉快!**********************\n");printf("\n********************~\(^o^)/~\(^o^)/~\(^o^)/~\(^o^)/~\(^o^)/~****************** *****\n");printf("\n\n");printf("按ENTER返回上一层");getchar();system("cls");}}int main(){char num[MAXSIZE];while(1){printf("\n###############欢迎各界人士指导!*******************键入Y开始################\n\n\n\n\n");printf(" ▆▆▆▆▆▆▆▆▆请选择操作方式▆▆▆▆▆▆▆▆▆▆▆\n\n");printf(" ①输入<Y>进入系统\n");printf(" ②输入<N>为退出程序\n");printf("\n ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆\n\n");printf("\n");printf(" →请输入操作<Y or N>:");while(1){gets(num);if(strcmp(num,"Y")==0||strcmp(num,"N")==0||strcmp(num,"y")==0||strcmp(num,"n")==0)break;elseprintf("\n你输入的数字有错,请重新输入:");}system("cls");switch(num[0]){case 'Y':case 'y':printf("\n");printf(" 题目:利用随机函数产生两列(每列个数均为150且每个数均不小于10) 的随机整数,对这两\t列整数写一个程序实现如下功能操作:\n");printf(" (1)两列整数在顺序存储方式中,\n\t a)找出这两列数中的素数\n\t b) 把两列数中相同的数转化为二进制数输出。