1、1数据结构实验指导2013 / 2014 学年 第 2 学期姓 名:_学 号:_班 级:_指导教师:_潍坊学院计算机工程学院20142预备实验 C 语言的函数数组指针结构体知识一、实验目的1、复习 C语言中函数、数组、指针和结构体的概念。2、熟悉利用 C语言进行程序设计的一般方法。二、实验内容和要求1、调试程序:输出 100以内所有的素数(用函数实现) 。#include/*判断一个数是否为素数*/int isprime(int n)for(int m=2;m*m#define N 10int main()int aN=0,1,2,3,4,5,6,7,8,9,i,temp;printf(“th
2、e original Array is:n ”);for(i=0;i#define M 3#define N 4int main()int aMN,i,j,k;printf(“请输入二维数组的数据:n”);for(i=0;iaik)k=j;for(j=0;jint main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int *p;for(p=a0;p#define N 10;struct studentchar num6; /*学号*/char name8; /*姓名*/int score3; /*成绩*/float avr; /*平均成绩 */stuN;
3、int main()int i,j,max,maxi,sum;5float average;for(i=0;imax)max=sum;maxi=i;average/=10;printf(“ 学号 姓名 成绩 1 成绩 2 成绩 3 平均分n);for(i=0;i#include#define ERROR 0#define OK 1#define INIT_SIZE 5 /*初始分配的顺序表长度*/#define INCREM 5 /*溢出时,顺序表长度的增量*/typedef int ElemType; /*定义表元素的类型*/typedef struct SqlistElemType *sl
4、ist; /*存储空间的基地址*/int length; /*顺序表的当前长度*/int listsize; /*当前分配的存储空间*/Sqlist;int InitList_sq(Sqlist *L); /* 初始化顺序表 L,并将其长度设为 0 */int CreateList_sq(Sqlist *L,int n); /* 构造顺序表的长度为 n */int ListInsert_sq(Sqlist *L,int i,ElemType e);/*在顺序线性表 L中第 i个 元素之前插入新的元素 e */int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/in
5、t ListDelete_sq(Sqlist *L,int i); /*删除第 i个元素*/int ListLocate(Sqlist *L,ElemType e); /*查找值为 e的元素*/int InitList_sq(Sqlist *L)L-slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType);if(!L-slist) return ERROR; L-length=0; L-listsize=INIT_SIZE; return OK; /*InitList*/8int CreateList_sq(Sqlist *L,int n)ElemT
6、ype e;int i;for(i=0;ilength;i+)printf(“%5d“,L-slisti-1);return OK;/*PrintList*/int ListInsert_sq(Sqlist *L,int i,ElemType e)int k;if(iL-length+1) return ERROR; if(L-length=L-listsize) L-slist=(ElemType*)realloc(L-slist,(INIT_SIZE+INCREM)*sizeof(ElemType);if(!L-slist) return ERROR; L-listsize+=INCREM
7、; for(k=L-length-1;k=i-1;k-) L-slistk+1=k;L-slisti-1=e; L-length+; return OK;/*ListInsert*/*在顺序表中删除第 i个元素*/int ListDelete_sq(Sqlist *L,int i) if(iL-length) return ERROR;for(p=i-1;plength-1;p+)9L-slistp=L-slistp+1;L-length-;return OK;/*在顺序表中查找指定值元素,返回其序号*/int ListLocate(Sqlist *L,ElemType e) int main
8、()Sqlist sl;int n;printf(“please input n:“); /*输入顺序表的元素个数*/scanf(“%d“,if(n0)printf(“n1-Create Sqlist:n“);InitList_sq(CreateList_sq(printf(“n2-Print Sqlist:n“);PrintList_sq(elseprintf(“ERROR“);return 0; 算法分析与运行结果please input n:51-Create Sqlist:input data 10input data 25input data 38input data 43input
9、 data 562-Print Sqlist:0 5 8 3 6Press any key to continue102、为第 1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。算法代码:int ListDelete_sq(Sqlist *L,int i) int p;if(iL-length) return ERROR;for(p=i-1;plength-1;p+) L-slistp=L-slistp+1;L-length-;return OK;/*在顺序表中查找指定值元素,返回其序号*/int ListLocate(Sqlist *L,ElemType e) int i=0
10、;while(ilength)if(ilength)return(i+1);elsereturn(-1);113、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。#include#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线性表的单链表存储*/ElemType data;struct LNode *next;LNode,*LinkList;LinkList CreateList(int n);/构造顺序表的长度 */12void Print
11、List(LinkList L); /*输出带头结点单链表的所有元素*/int GetElem(LinkList L,int i,ElemType *e); /*在顺序线性表 L中 ,当第i个元素存在时,将其赋值为 e */LinkList CreateList(int n)LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LNode); head-next=NULL;p=head;for(i=0;idata); /*输入元素值*/q-next=NULL; /*结点指针域置空*/p-next=q; /*新结点连在表末尾*/p=q;retu
12、rn head;/*CreateList*/void PrintList(LinkList L)LNode *p;p=L-next; /*p指向单链表的第 1个元素*/while(p!=NULL)printf(“%5d“,p-data);p=p-next;/*PrintList*/int GetElem(LinkList L,int i,ElemType *e)LNode *p;int j=1;p=L-next;while(pj+;if(!p|ji)return ERROR; *e=p-data; return OK;/*GetElem*/int main()int n,i;ElemType
13、e;13LinkList L=NULL; /*定义指向单链表的指针*/printf(“please input n:“); /*输入单链表的元素个数 */scanf(“%d“,if(n0)printf(“n1-Create LinkList:n“);L=CreateList(n); printf(“n2-Print LinkList:n“);PrintList(L); printf(“n3-GetElem from LinkList:n“);printf(“input i=“);scanf(“%d“,if(GetElem(L,i,elseprintf(“not exists“);elsepri
14、ntf(“ERROR“);return 0; 算法分析与运行结果please input n:51-Create LinkList:input data 1:8input data 2:6input data 3:3input data 4:5input data 5:42-Print LinkList:8 6 3 5 43-GetElem from LinkList:input i=2No2 is 6Press any key to continue144、为第 3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。 算法代码int ListInsert_sq(LNode
15、 *L,int i,ElemType e)int k;if(iL-length+1) return ERROR; if(L-length=L-listsize) L-data =(ElemType*)realloc(L-data,(INIT_SIZE+INCREM)*sizeof(ElemType);if(!L-data) return ERROR; L-listsize+=INCREM; 15#include#include#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct LNode /*线
16、性表的单链表存储*/ElemType data;struct LNode *next;LNode,*LinkList;LinkList CreateList(int n);/*16以下为选做实验:5、循环链表的应用(约瑟夫回环问题)n个数据元素构成一个环,从环中任意位置开始计数,计到 m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。提示:用一个无头结点的循环单链表来实现 n个元素的存储。 算法代码6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。提示:指针 p从链表的第一个元素开始,利用指针 q从指针 p位置开始向后搜索整个链表,删除与之值相同的元素;指针 p继续
17、指向下一个元素,开始下一轮的删除,直至pnull 为至,既完成了对整个链表元素的删除相同值。 算法代码三、实验小结具体的掌握线性表中元素的前驱、后续的概念。以及顺序表与链表的建立、插入元素、删除表中某元素的算法。并学习了对线性表相应算法的时间复杂度进行分析。四、教师评语17实验二 栈和队列一、实验目的1、掌握栈的结构特性及其入栈,出栈操作;2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。二、实验内容和要求1、阅读下面程序,将函数 Push和函数 Pop补充完整。要求输入元素序列 1 2 3 4 5 e,运行结果如下所示。#include#include#define E
18、RROR 0#define OK 1#define STACK_INT_SIZE 10 /*存储空间初始分配量*/#define STACKINCREMENT 5 /*存储空间分配增量*/typedef int ElemType; /*定义元素的类型*/typedef structElemType *base;ElemType *top;int stacksize; /*当前已分配的存储空间*/SqStack;int InitStack(SqStack *S); /*构造空栈*/int push(SqStack *S,ElemType *e); /*入栈*/int Pop(SqStack *S
19、,ElemType *e); /*出栈*/int CreateStack(SqStack *S); /*创建栈*/void PrintStack(SqStack *S); /*出栈并输出栈中元素*/int InitStack(SqStack *S)S-base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType);18if(!S-base) return ERROR;S-top=S-base;S-stacksize=STACK_INT_SIZE;return OK;/*InitStack*/int Push(SqStack *S,ElemTyp
20、e e)/*Push*/int Pop(SqStack *S,ElemType *e)/*Pop*/int CreateStack(SqStack *S)int e;if(InitStack(S)printf(“Init Success!n“);elseprintf(“Init Fail!n“);return ERROR;printf(“input data:(Terminated by inputing a character)n“);while(scanf(“%d“,return OK;/*CreateStack*/void PrintStack(SqStack *S)ElemType e
21、;while(Pop(S,/*Pop_and_Print*/int main()SqStack ss;printf(“n1-createStackn“);CreateStack(printf(“n2-PopPrintStack(return 0; 算法分析:输入元素序列 1 2 3 4 5,为什么输出序列为 5 4 3 2 1?体现了栈的什么特性?192、在第 1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现) ,并验证其正确性。 实现代码void conveshen(SqStack *S) ElemType n,h;int m=0,k=0;InitStack(S)
22、;printf(“Input elementn“);scanf(“%d“, while(n)m+;Push(S,n%2);n=n/2;while(k#include#include#define M 20#define elemtype chartypedef structelemtype stackM;int top;stacknode;void init(stacknode *st);void push(stacknode *st,elemtype x);void pop(stacknode *st);void init(stacknode *st)st-top=0;void push(s
23、tacknode *st,elemtype x)if(st-top=M)21printf(“the stack is overflow!n“);elsest-top=st-top+1;st-stackst-top=x;void pop(stacknode *st)st-top=st-top-1;int main()char sM;int i;printf(“create a empty stack!n“);stacknode *sp;sp=malloc(sizeof(stacknode);init(sp);printf(“input a expression:n“);gets(s);for(i
24、=0;itop=0)printf(“(match)!n“);elseprintf(“(not match)!n“);return 0; 输入:2+(c-d)*6-(f-7)*a)/6 运行结果:22 输入:a-(c-d)*6-(s/3-x)/2 运行结果: 程序的基本功能:以下为选做实验:234、设计算法,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。 实现代码5、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针),试编写相应的置空队列、入队列、出队列的算法。实现代码:三、实验小结基本掌握栈的结构特性及其入栈,出栈操作;以及队列的结构特性
25、及其入队、出队的操作,掌握循环队列的特点及其操作四、教师评语24实验三 串的模式匹配一、实验目的1、了解串的基本概念2、掌握串的模式匹配算法的实现 二、实验内容和要求1、阅读并运行下面程序,根据输入写出运行结果。#include#include#define MAXSIZE 100typedef structchar dataMAXSIZE;int length;SqString;int strCompare(SqString *s1,SqString *s2); /*串的比较*/void show_strCompare();void strSub(SqString *s,int start,
26、int sublen,SqString *sub); /*求子串*/void show_subString();int strCompare(SqString *s1,SqString *s2)int i;for(i=0;ilengthi+)if(s1-datai!=s2-datai)return s1-datai-s2-datai;return s1-length-s2-length;void show_strCompare()SqString s1,s2;int k;printf(“n*show Compare*n“);printf(“input string s1:“);gets(s1.
27、data);s1.length=strlen(s1.data);printf(“input string s2:“);gets(s2.data);s2.length=strlen(s2.data);if(k=strCompare(25else if(ks2n“);printf(“n*show over*n“);void strSub(SqString *s,int start,int sublen,SqString *sub)int i;if(starts-length|sublens-length-start+1)sub-length=0;for(i=0;idatai=s-datastart
28、+i-1;sub-length=sublen;void show_subString()SqString s,sub;int start,sublen,i;printf(“n*show subString*n“);printf(“input string s:“);gets(s.data);s.length=strlen(s.data);printf(“input start:“);scanf(“%d“,printf(“input sublen:“);scanf(“%d“,strSub(if(sub.length=0)printf(“ERROR!n“);elseprintf(“subStrin
29、g is :“);for(i=0;i#include#define MAXSIZE 100typedef structchar dataMAXSIZE;28int length;SqString;int index_bf(SqString *s,SqString *t,int start);void getNext(SqString *t,int next);int index_kmp(SqString *s,SqString *t,int start,int next);void show_index();int index_bf(SqString *s,SqString *t,int st
30、art)int i,j,pos;if(t-length=0) return(0);pos=start;i=pos;j=0;while(ilengthj+;elsepos+;i=pos;j=0;if(j=t-length)return(pos);else return(-1);void getNext(SqString *t,int next)int i=0,j=-1;next0=-1;while(ilength)if(j=-1)|(t-datai=t-dataj)i+;j+;nexti=j;elsej=nextj;int index_kmp(SqString *s,SqString *t,in
31、t start,int next)int i,j;if(t-length=0) return(0);i=start;j=0;while(ilength j+;else j=nextj;if(j=t-length ) return (i-j);else return (-1);void show_index()SqString s,t;int k,nextMAXSIZE=0,i;printf(“n*show index*n“);printf(“input string s:“);gets(s.data);s.length=strlen(s.data);printf(“input string t
32、:“);gets(t.data);t.length=strlen(t.data);printf(“input start position:“);scanf(“%d“,printf(“BF:nthe result of BF is %dn“,index_bf(getNext(printf(“KMP:n“);printf(“next:“);for(i=0;it.length;i+)printf(“%3d“,nexti);printf(“n“);printf(“the result of KMP is %dn“,index_kmp(printf(“n*show over*n“);int main()show_index();return 0;输入:abcaabbabcabaacbacbaabcabaa301运行结果:三、实验小结通过对算法的运行,加上思考可以深刻了解串的基本概念。并且可以掌握串的模式匹配算法的建立。 四、教师评语