1、(类C算法的程序实现)(1) 输入一组数据存入数组中,并将数据元素的个数动态地由输入函数完成。求输入数据的最大值、最小值,并通过函数参数返回所求结果;实验准备:1) 计算机设备;2) 程序调试环境的准备,如TC环境;3) 实验内容的算法分析与代码设计与分析准备。实验步骤:1.安装TC并设置好环境,如果已安装好,可以跳过此步;2.录入程序代码并进行调试和算法分析;对实验内容(1)的操作步骤:1) 用类C语言描述算法过程;2) 用C语言环境实现该算法。对实验内容(2)的操作步骤:1) 完成算法的C实现;2) 分析其时间复杂度和空间复杂度。3.编写实验报告。实验结果:/ 动态分配数组空间#inclu
2、de stdio.hmalloc.hint size,i;int *pArray;int *p;void malloc_size() pArray=(int *)malloc(size*(sizeof(int);int input_size() printf(please input the size:n);size= scanf(%d,&size); return 0;int input_data()please input the value: for(i=0;i=pi) x=pi; if(y=pi) y=pi;min= %dt max=%dn,x,y);int Output_data()
3、 p=pArray;before ofpaixu :%dt,*pArray); pArray+;void paixu() int x=0; int i,j;later of paixu: for(j=i+1;j=pj) x=pi;pi=pj;pj=x; ,pi);void main() clrscr(); input_size(); malloc_size(); input_data(); Output_data(); Compare(); paixu();实验二 线性表及其基本操作实验(2学时)(1) 熟练掌握线性表ADT和相关算法描述、基本程序实现结构;(2) 以线性表的基本操作为基础实现
4、相应的程序;(3) 掌握线性表的顺序存储结构和动态存储结构之区分。(类C算法的程序实现,任选其一。具体要求参见教学实验大纲)(1) 一元多项式运算的C语言程序实现(加法必做,其它选做);(2) 有序表的合并;(3) 集合的并、交、补运算;1.录入程序代码并进行调试和算法分析;2.编写实验报告。/线性链表#define M 6typedef struct node int data; struct node *next;*Sqlist;void Initlialize(Sqlist &L) L=(Sqlist)malloc(sizeof(Sqlist); L-next =NULL;int Get
5、length(Sqlist L) int i=0; Sqlist p=L-next ; while(p!=NULL) i+; p=p-next; return i;int Getelem(Sqlist L,int i) int j=1,e; while(jdata ;第 %d 个元素是:%dn,i,e); return 1;int Locatelem(Sqlist L,int x)=NULL&p-data !=x) p=p- if(p=NULL) return 0; else %d 是第 %d 个元素n,x,i);void CreatlistF(Sqlist &L,int a,int n)/头
6、插法/从一个空表开始,读取字符数组a中字符生成新结点,将读取数据存放到新结点数据域,/再将新结点插入当前链表表头、直至结束 Sqlist s; int i;n; s=(Sqlist)malloc(sizeof(Sqlist); s-data =ai; s-next =L- L-next =s;void CreatlistR(Sqlist &L,int a,int n)/尾插法/将新结点插到当前链表表尾,为此必须新增一个尾指针r,使其始终指向当前链表的尾结点 Sqlist s,r; r=L;next=NULL; r-next =s ; r =s;int Inselem(Sqlist &L,int
7、 i,int x)/1、将所建新结点s的next域指向p的下一结点:s-next=p-next/2、将结点p的next域指向新结点s:next=s int j=1; Sqlist s,p=L- s=(Sqlist)malloc(sizeof(Sqlist);data =x; if(iGetlength(L)i-1)在第 %d 个位置插入数据:,i,x);next =p- p-int Delelem(Sqlist &L,int i) Sqlist p,q; p=L; q=p-next =q- free(q);void Displist(Sqlist L),p-data); printf(“n”)
8、;void input(int *pArray,int n)请输入数组数据(共含 %d 个元):,n); for(int i=0;i+) Scanf(“%d”,&int main(int argc, char* argv) Sqlist L; int ArrayM,Select; Initlialize(L); do请输入选择方法(1表示头插法,2表示尾插法,0表示结束):Select); switch(Select) case 1:按头插法建立线性表:input(Array,M); CreatlistF(L,Array,M);break; case 2:按尾插法建立线性表:Creatlist
9、R(L,Array,M);原线性表数据为: Displist(L); Getelem(L,3); Locatelem(L,2); Inselem(L,5,5);修改后的线性表数据为: / Delelem(L,4); while(Select!=0);/运行结果:实验三 栈和队列实验(6学时)(1) 熟练掌握栈和队列的抽象数据类型及其结构特点;(2) 实现基本的栈和队列的基本操作算法程序。(类C算法的程序实现,任选其一)(1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP等操作)(必做);(2) 以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计与实现(选做)
10、; 2.编写实验报告。(1)/*队列存储*/typedef int status;#define QueueSize 10typedef struct sqqueue char dataQueueSize; int front,rear;SqQueue;void InitQueue(SqQueue &qu) qu.front =qu.rear =0;status EnQueue(SqQueue &qu,char x) if(qu.rear +1)%QueueSize=qu.front) qu.rear =(qu.rear+1)%QueueSize; qu.dataqu.rear=x;statu
11、s DeQueue(SqQueue &qu,char &x) if(qu.rear=qu.front ) qu.front =(qu.front +1)%QueueSize; x=qu.dataqu.front;status GetHead(SqQueue qu,char & if(qu.rear =qu.front) x=qu.data(qu.front+1)%QueueSize;status QueueEmpty(SqQueue qu) if(qu.rear=qu.front) return 1; else SqQueue qu; char e; InitQueue(qu);Queue %
12、sn,(QueueEmpty(qu)=1?Empty:Not Empty);inser an EnQueue(qu,ainser bnbinser cncinser dnd GetHead(qu,e);Queue of top elem is: %cn,e);show of Queue: while(!QueueEmpty(qu) DeQueue(qu,e);%ct(2)/*用栈实现对表达式的求值运算*/stdlib.h /*数据类型转换库函数*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE
13、 -1#define OVERFLOW -2#define STACK_INIT_SIZE 100 /*初始分配量*/#define STACKINCREMENT 10 /*存储空间的分配增量*/typedef int Status;typedef char ElemType;typedef ElemType OperandType; /*操作数*/typedef char OperatorType;typedef struct ElemType *base; ElemType *top; int stacksize;SqStack;Status InitStack(SqStack &S) /
14、*构造一个空栈S */ S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType); if(!S.base) exit (OVERFLOW); /*存储空间失败*/ S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; /* InitStack*/Status GetTop(SqStack S) /* 若栈不空,则用e返回S的栈顶元素*/ ElemType e; if (S.top = S.base) return ERROR; e = *(S.top-1); ret
15、urn e; /*GetTop*/Status Push (SqStack &S,ElemType e) /*插入元素e为新的栈顶元素*/ if (S.top - S.base = S.stacksize) /* 栈满,追加存储空间*/ S.base = (ElemType *) realloc ( S.base,(S.stacksize + STACKINCREMENT) * sizeof(ElemType); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; *S.top+ = e; /*Push*/Status Po
16、p (SqStack &S,ElemType &e) /*取栈顶元素,用e返回*/ /*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if(S.top = S.base) return ERROR; e = * -S.top; /*Pop*/char In(char c,char OP) /*判断字符c是否属于运算符*/ if(c=35 & c;2表示 else if(mab=2) return 47) a=atoi(&a); /*将字符数转化为整型数*/ if(b47) b=atoi(&b); switch(theta) case return a+b;
17、break; return a-b; return a*b; return a/b; return 1OperandType EvaluateExpression() /*算术表达式求值的算符优先算法*/ SqStack OPTR,OPND; /* 设OPTR、OPND分别运算符栈和运算数栈*/ OperandType a,b,c; OperatorType theta; InitStack(OPTR); Push(OPTR, InitStack(OPND); c=getchar(); while (c! | GetTop(OPTR)!) if (!In(c,OP)Push(OPND,c);c
18、=getchar(); switch(Precede(GetTop(OPTR),c) : Push(OPTR,c); c = getchar(); Pop(OPTR,c); Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b); return GetTop(OPND);int main( )(请输入运算表达式:以#为结束符)n int a; a=(int)EvaluateExpression();/*执行函数EvaluateExpression(),将表达式的最终值强制转换为整型,并用a返回*/,a); getchar(); 测试结果为:表达式中包含+、-、*的情况;表达式中包含()、+、-、*的情况;表达式中包含()、+、-、*、/的情况;表达式中出现负数的情况;实验四 字符串