数据结构试验

实验四  排序方法实践(2学时)

1、实验目的

通过本实验掌握排序的基本算法和过程以及查找的基本方法和过程。

2、实验内容

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。

1)按照卡号顺序进行排序;

2)能够实现查找某个系的所有的借书卡号并输出。

3、实验要求

(1)建立关于借书证信息结点的结构体;

(2)定义借书证信息的记录并录入基本信息;

(3)写出用某种排序算法(如冒泡排序)按关键字对记录进行排序的算法函数;

(4)对借书证信息的记录按系名建立索引查找结构;

(5)输入某个要查找的系名,用索引查找方法查找并输出该系的所有借书证信息。

源码

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

# define MAXSIZE 100

 struct student

{

       intnumber;//卡号

       charname[8];//名字

       charmajor[20];//专业

       intclassnumber;//班号

};

 

typedef struct studentlist

{

       structstudent  key;

       intlength;

       intr[MAXSIZE];

}table;

void input(table *tab)

{

       chars='Y';

       tab->length=1;

       while((s=='Y'||s=='y')&&tab->length<MAXSIZE)

       {

       printf("请输入卡号:\n");

       scanf("%d",&tab->key.number);

       printf("请输入姓名:\n");

       scanf("%s",tab->key.name);

       printf("请输入专业:\n");

       scanf("%s",tab->key.major);

       printf("请输入班号:\n");

       scanf("%d",&tab->key.classnumber);

       printf("请问是否继续输入Y/N");

       getchar();

       scanf("%c",&s);

       tab->length++;

}

}

void output2(table *tab)

{

       printf("卡号:%d\n",tab->key.number);

       printf("姓名:%s\n",tab->key.name);

       printf("专业:%s\n",tab->key.major);

       printf("班号:%d\n",tab->key.classnumber);

}

void output(table *tab)

{

       printf("卡号:%d\n",tab->key.number);

       printf("姓名:%s\n",tab->key.name);

       printf("专业:%s\n",tab->key.major);

       printf("班号:%d\n",tab->key.classnumber);

      

}

void shellinsertsort(table *tab)

{

       inti,j,d;

       d=tab->length/2;

       while(d>=1)

       {

              for(i=d+1;i<=tab->length;i++)

              {

                     tab->r[0]=tab->r[i];

                     j=i-d;

                     while(j>0&&tab->key.number<tab->key.number)

                     {

                            tab->r[j+d]=tab->r[j];

                            j=j-d;

                     }

                     tab->r[j+d]=tab->r[0];

              }

              d=d/2;

       }

       for(i=0;i<tab->length;i++)

       {

   output(tab);

    }

}

void search(table *tab)

{

       inti=1,j=1;

       charmajor[20];

       printf("请输入你要查找的系名:");

       scanf("%s",major);

       while(i<tab->length)

       {

              if(!strcmp(tab->key.major,major))

              {

              output(tab);

              j=0;

       }

       i++;

       }

 if(j)

 printf("不存在!!!");

}

int main()

{

       intx,select=1;

       tabletabl;

       while(select)

       {

              printf("\t\t\t\t------------------\n");

              printf("\t\t\t\t|1录入信息       |\n");

              printf("\t\t\t\t|2  输出           |\n");

              printf("\t\t\t\t|3  排序输出           |\n");

              printf("\t\t\t\t|4  查找           |\n");

              printf("\t\t\t\t|5  退出           |\n");

              printf("\t\t\t\t------------------\n");

              printf("请输入选择");

              scanf("%d",&x);

              switch(x)

              {

                     case1:input(&tabl);break;

                     case2:output2(&tabl);break;

                     case3:shellinsertsort(&tabl);break;

                     case4:search(&tabl);break;

                     case5:select=0;printf("退出成功");break;

                     default:printf("请重新输入!!!");

               }

       }

       return0;

}

 

 

 

 


数据结构实验 #include #include #include #define NULL 0 #define OK 1 #define ERROR -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /*定义字符类型栈*/ typedef struct{ int stacksize; char *base; char *top; } Stack; //栈的类型 /* 定义整型栈*/ typedef struct{ int stacksize; //栈类型个数 int *base; int *top; } Stack2; /* ----------------- 全局变量--------------- */ Stack OPTR; /* 定义运算符栈*/ Stack2 OPND; /* 定义操作数栈*/ char expr[255] = ""; /* 存放表达式串*/ char *ptr = expr; int InitStack(Stack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); //建立结点 if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int InitStack2(Stack2 *s) //构造操作数栈 { s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE; s->top=s->base; return OK; } int In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch==&#39;+&#39;||ch==&#39;-&#39;||ch==&#39;*&#39;||ch==&#39;/&#39;||ch==&#39;(&#39;||ch==&#39;)&#39;||ch==&#39;#&#39;); } int Push(Stack *s,char ch) //运算符栈插入ch为新的栈顶元素 { *s->top=ch; s->top++; return 0; } int Push2(Stack2 *s,int ch)//操作数栈插入ch为新的栈顶元素 { *s->top=ch; s->top++; return 0; } char Pop(Stack *s) //删除运算符栈s的栈顶元素,用p返回其值 { char p; s->top--; p=*s->top; return p; } int Pop2(Stack2 *s)//删除操作数栈s的栈顶元素,用p返回其值 { int p; s->top--; p=*s->top; return p; } char GetTop(Stack s)//的栈顶元素 { char p=*(s.top-1); return p; } int GetTop2(Stack2 s) //用p返回操作数栈s的栈顶元素 { int p=*(s.top-1); return p; } /* 判断运算符优先权,返回优先权高的*/ char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ //array是数组 &#39;>&#39;, &#39;>&#39;, &#39;<&#39;, &#39;<&#39;, &#39;&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;<&#39;, &#39;<&#39;, &#39;&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;&#39;, &#39;>&#39;, &#39;<&#39;, &#39;<&#39;, &#39;<&#39;, &#39;<&#39;, &#39;&#39;, &#39;>&#39;, &#39;>&#39;, &#39;>&#39;, &#39;!&#39;, &#39;>&#39;, &#39;>&#39;, &#39;<&#39;, &#39;<&#39;, &#39;<&#39;, &#39;<&#39;, &#39;<&#39;, &#39;!&#39;, &#39;=&#39;}; switch(c1) { /* i为下面array的横标 */ case &#39;+&#39; : i=0;break; case &#39;-&#39; : i=1;break; case &#39;*&#39; : i=2;break; case &#39;/&#39; : i=3;break; case &#39;(&#39; : i=4;break; case &#39;)&#39; : i=5;break; case &#39;#&#39; : i=6;break; } switch(c2) { /* j为下面array的纵标 */ case &#39;+&#39; : j=0;break; case &#39;-&#39; : j=1;break; case &#39;*&#39; : j=2;break; case &#39;/&#39; : j=3;break; case &#39;(&#39; : j=4;break; case &#39;)&#39; : j=5;break; case &#39;#&#39; : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ } /*操作函数 */ int Operate(int a,char op,int b) { switch(op) { case &#39;+&#39; : return (a+b); case &#39;-&#39; : return (a-b); case &#39;*&#39; : return (a*b); case &#39;/&#39; : return (a/b); } return 0; } int num(int n)//返回操作数的长度 { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } int EvalExpr()//主要操作函数 { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!=&#39;#&#39;||GetTop(OPTR)!=&#39;#&#39;) { if(!In(c)) { if(!In(*(ptr-1))) ptr=ptr-1; m=atoi(ptr);//取字符串前面的数字段 n=num(m); Push2(&OPND,m); ptr=ptr+n; c=*ptr++; } else switch(Precede(GetTop(OPTR),c)) { case &#39;&#39;: //退栈将运算结果入栈 theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND); Push2(&OPND,Operate(a,theta,b)); break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以&#39;#&#39;结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,&#39;#&#39;); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值