数据结构上机成品记录

来源:互联网 发布:淘宝微淘盖楼怎么找 编辑:程序博客网 时间:2024/04/28 11:14

10.20

建立学生通讯录,记录姓名与学号

实现1)插入

       2)删除

       3)输出通讯录的全部信息

      4)输出指定学生的信息

       5)退出程序

#include#include#includetypedef struct student_node{char name[10];int number;struct student_node *next;}node;node *init(){return NULL;}node *creat(char n[],int num){node* p;p=(node*)malloc(sizeof(node));strcpy(p->name,n);p->number=num;p->next=NULL;return p;}void display(node* head){node *p;p=head;if(!p) printf("\n通讯录是空的");else{while(p){printf("姓名:%s;学号:%5d\n",p->name,p->number);p=p->next;}}}void spe_display(node *head,char n[]){node *p;p=head;if(!p) printf("通讯录是空的\n");while(p&&(strcmp(p->name,n))){p=p->next;}if(p){printf("姓名:%s,学号:%5d\n",p->name,p->number);}elseprintf("不存在");}node* delet(node *head,int num){node *pre=NULL,*p;if(!head){printf("通讯录是空的\n");return head;}p=head;while(p&&p->number!=num){pre=p;p=p->next;}if(p){if(!pre)head=head->next;elsepre->next=p->next;free(p);}return head;}node *find(node* head,int num){node *p=head;while(p&&p->number!=num)p=p->next;if(p)return p;else{printf("不存在\n");return NULL;}}node* insert(node* head,char n[],int num,int pre_num){node *p,*q;if(pre_num!=0){q=find(head,pre_num);if(!q)printf("不能插入");else{printf("hello");p=creat(n,num);p->next=q->next;q->next=p;}}else{p=creat(n,num);p->next=head;head=p;}return head;}void main(){node *head,*p,*q=NULL;int pepole_num,i,num,pre_num;char n[10],press,*m,f[10],z[10];head=init();printf("请输入通讯录中的人数:\n");scanf("%d",&pepole_num);for(i=1;i<=pepole_num;i++){printf("输入第%d个学生的信息:\n",i);printf("学号:");scanf("%d",&num);printf("\n姓名:");scanf("%s",n);p=creat(n,num);if(q){q->next=p;q=p;}if(i==1){head=p;q=head;}}while(1){scanf("%c",&press);printf("\n插入请按1\n");printf("删除请按2\n");printf("输出全部信息请按3\n");printf("输出指定信息请按4\n");printf("退出请按5\n");scanf("%c",&press);switch(press){case'1':{printf("输入姓名:");scanf("%s",n);printf("\n输入学号:");scanf("%d",&num);printf("\n输入前一位同学的学号:\n");scanf("%d",&pre_num);head=insert(head,n,num,pre_num);}break;case'2':{printf("输入删除学生的学号\n");scanf("%d",&num);head=delet(head,num);}break;case'3':{display(head);}break;case'4':{printf("输入指定输出的学生姓名:");scanf("%s",n);spe_display(head,n);}break;case'5':{exit(1);}break;default:;break;}}}


11.2

建立储存商品信息的二叉树(前序输入)

实现

1)三种顺序的遍历(我用的是递归方法)

2)查找指定名称的商品信息

#include#include#includetypedef char name;typedef int price;typedef struct node{name nam[10];price pri;struct node *lchild,*rchild;}bitnode;typedef bitnode *bintree;bintree root;bintree createbintree(){bintree t;name n[10];price p;t=(bitnode*)malloc(sizeof(bitnode));printf("请输入商品名:\n");scanf("%s",n);strcpy(t->nam,n);if(!strcmp(n,"#")){printf("空的\n");t=NULL;}else{printf("请输入价格:\n");scanf("%d",&p);t->pri=p;printf("end\n");t->lchild=createbintree();t->rchild=createbintree();}return t;}void preorder(bintree t){if(t){printf("姓名:%s\n",t->nam);printf("价格:%d元\n",t->pri);preorder(t->lchild);preorder(t->rchild);}}void inorder(bintree t){if(t){inorder(t->lchild);printf("姓名:%s\n",t->nam);printf("价格:%d元\n",t->pri);inorder(t->rchild);}}void postorder(bintree t){if(t){postorder(t->lchild);postorder(t->rchild);printf("姓名:%s",t->nam);printf("价格:%d元",t->pri);}}bintree locate(bintree t,name n[10]){bintree p;if(t==NULL)return NULL;elseif(strcmp(t->nam,n))return t;else{p=locate(t->lchild,n);if(p)return p;elsereturn locate(t->rchild,n);}}void main(){bintree p,s;char press,v;name n[10];printf("请开始录入商品信息:\n");p=createbintree();while(1){v=getchar();printf("\n前序输出请按1\n倒序输出请按2\n中序输出请按3\n查找商品请按4\n");scanf("%c",&press);switch(press){case'1':{preorder(p);}break;case'2':postorder(p);break;case'3':inorder(p);break;case'4':{printf("请输入查找商品名\n");scanf("%s",n);s=locate(p,n);if(s==NULL)printf("不存在");elseprintf("商品价格:%d\n",s->pri);}break;default:exit(1);}}}

11.29

交通图

其实主要套用的是书上代码,就是写find 的时候出了问题弄了好一会儿

#include<stdio.h>#include<stdlib.h>#include<string.h>#define M 20#define FINITY 5000typedef struct{char name[20];int pepole;}city;typedef int road;typedef struct{city citys[M];road roads[M][M];int n,e;}Mgraph;typedef enum {FALSE,TRUE} boolean;typedef int dist[M];typedef int path[M];typedef int fdist[M][M];typedef int fpath[M][M];void dijkstra(Mgraph g,int v0,path p,dist d){boolean final[M];int i,k,v,min;for(v=0;v<g.n;v++){final[v]=FALSE;d[v]=g.roads[v0][v];if(d[v]<FINITY&&d[v]!=0)p[v]=v0;else p[v]=-1;}final[v0]=TRUE;d[v0]=0;for(i=1;i<g.n;i++){min=FINITY;for(k=0;k<g.n;++k){if(!final[k]&&d[k]<min){v=k;min=d[k];}}printf("%d...",v);printf("\n%s---%d  %d\n",g.citys[v].name,min,v);if(min==FINITY) return;final[v]=TRUE;for(k=0;k<g.n;++k){if(!final[k]&&(min+g.roads[v][k]<d[k])){d[k]=min+g.roads[v][k];p[k]=v;}}}}void print_gpd(Mgraph g,path p,dist d){int st[M],i,pre,top=-1;for(i=0;i<g.n;i++){printf("\nDISTANCED:%7d,path:",d[i]);st[++top]=i;pre=p[i];while(pre!=-1){st[++top]=pre;pre=p[pre];}while(top>0)printf("%2d",st[top--]);}}void floyd(Mgraph g,fpath p,fdist d){int i,j,k;for(i=0;i<g.n;i++)for(j=0;j<g.n;j++){d[i][j]=g.roads[i][j];if(i!=j&&d[i][j]<FINITY){p[i][j]=i;}elsep[i][j]=-1;}for(k=0;k<g.n;k++){for(i=0;i<g.n;i++){for(j=0;j<g.n;j++){if(d[i][j]>(d[i][k]+d[k][j])){d[i][j]=d[i][k]+d[j][k];p[i][j]=k;}}}}printf("*******%d\n",d[0][1]);}void creat(Mgraph *g){int i,j,w;//char na[20];printf("请输入图的顶点数与边数\n");scanf("%d%d",&g->n,&g->e);for(i=0;i<g->n;i++){printf("请输入图中城市名称:\n");scanf("%s",g->citys[i].name);}for(i=0;i<g->n;i++){for(j=0;j<g->n;j++){if(i==j)g->roads[i][j]=0;elseg->roads[i][j]=FINITY;}}/*for(k=0;k<g->e;k++){}书中的用文见输入用的是边*/for(i=0;i<g->n;i++){for(j=1;((g->n)-(i+j))>=1;j++){printf("请输入%s到%s之间的距离:\n",g->citys[i].name,g->citys[i+j].name);scanf("%d",&w);g->roads[i][i+j]=w;g->roads[j+i][i]=w;}}//printf("hello\n");printf("创建完成\n");}int find(char na[],Mgraph g){int i=0;for(i=0;i<g.n;++i){if(!(strcmp(g.citys[i].name,na))){printf("%d",i);return i;}}}void main(){int choice;char na[20],na1[20],na2[20];Mgraph g;path p;dist d;fpath fp;fdist fd;int v0,i,j;creat(&g);floyd(g,fp,fd);while(1){printf("\n根据Dijkstra算法计算某城市到其他城市的最短路径:(1)\n");printf("根据Floyed求某对城市间的最短路径:(2)\n");printf("退出:(3)\n");printf("请输入选择的功能\n");scanf("%d",&choice);switch(choice){case 1:{printf("请输入起点城市:\n");scanf("%s",na);v0=find(na,g);dijkstra(g,v0,p,d);print_gpd(g,p,d);}break;case 2:{printf("请输入起点城市:\n");scanf("%s",na1);i=find(na1,g);printf("请输入终点城市:\n");scanf("%s",na2);j=find(na2,g);printf("%s到%s的最短距离是:%d\n",na1,na2,fd[i][j]);}break;case 3:exit (1);}}}

12.5

索引排序和分块检索

#include<stdio.h>#include<string.h>#define MAXSIZE 100typedef int keytype;typedef char datatype[10];typedef struct{int card_number;char name[10];char yuanxi[10];int class_number;}card;typedef struct{datatype key;int max;int address;}indexnode;typedef struct{keytype key;int other;//在cards数组中的序号}recordtype;typedef struct{recordtype r[MAXSIZE+1];int length;}table;void inittable(table *tab,card cards[]){int i=0,j=0;tab->r[j++].key=0;while(cards[i].card_number!=0){tab->r[j].key=cards[i].card_number;tab->r[j].other=i;tab->length=i+1;i++;j++;}}void binarysort(table *tab){int i,j,left,right,mid;for(i=2;i<tab->length;i++){tab->r[0]=tab->r[i];left=1;right=i-1;while(left<=right){mid=(left+right)/2;if(tab->r[i].key<tab->r[mid].key)right=mid-1;elseleft=mid+1;}for(j=i-1;j>=left;j--)tab->r[j+1]=tab->r[j];tab->r[left]=tab->r[0];}}int creat(card cards[]){int i=0;printf("请输入借书证信息\n");while(1){printf("请输入卡号:\n");scanf("%d",&cards[i].card_number);if(cards[i].card_number==0){printf("输入结束\n");printf("%d\n",cards[i].card_number);return 0;}printf("请输入学生姓名\n");scanf("%s",cards[i].name);printf("请输入学生所在院系\n");scanf("%s",cards[i].yuanxi);printf("请输入学生所在班级\n");scanf("%d",&cards[i].class_number);printf("输入下一个\n");i++;}}int creat_index(indexnode index[],card cards[]){int i=0,j=0,max;char na[10];strcpy(na,cards[i].yuanxi);max=cards[i].card_number;while(cards[i].card_number!=0){while(!strcmp(na,cards[i].yuanxi)&&cards[i].card_number!=0){if(cards[i].card_number>max)max=cards[i].card_number;printf("hello\n");i++;}printf("###%d\n",i);if(cards[i-1].card_number!=0){index[j].address=i-1;strcpy(index[j].key,cards[i-1].yuanxi);index[j].max=max;if(cards[i].card_number!=0)strcpy(na,cards[i].yuanxi);j++;}printf("%d\n",cards[i].card_number);}printf("%dsadsad",j-1);return j-1;}void IndexSeqSearch(card cards[],indexnode index[],int m,datatype key){int i=0,j;while((i<=m)&&(strcmp(key,index[i].key)))i++;if(i>m)printf("不存在\n");else{printf("no.%d",i);j=index[i].address;printf("该院所有学生信息如下:\n");if(i==0){while(j>=0){printf("姓名:%s\n",cards[j].name);printf("卡号:%d\n",cards[j].card_number);printf("班级:%d\n",cards[j].class_number);j--;}}else{while(j>index[i-1].address){printf("姓名:%s\n",cards[j].name);printf("卡号:%d\n",cards[j].card_number);printf("班级:%d\n",cards[j].class_number);j--;}}}}void main(){int m,z,i;datatype key;card cards[10];table tab;indexnode index[3];creat(cards);inittable(&tab,cards);binarysort(&tab);m=creat_index(index,cards);while(1){printf("1:查找院系\n");printf("2:按卡号排序\n");scanf("%d",&z);switch(z){case 1:{printf("请输入查找院系:\n");scanf("%s",key);IndexSeqSearch(cards,index,m,key);}break;case 2:{for(i=1;i<=tab.length;i++){printf("卡号:%d\n",cards[tab.r[i].other].card_number);printf("姓名:%s\n",cards[tab.r[i].other].name);}}break;default:;break;}}}


原创粉丝点击