1、数据结构C语言版严蔚敏著数据结构(C语言版)严蔚敏著数据结构实验指导及报告书 /学年 第 1 学期 姓名:胡汜亮学号:班级:指导教师: 1 实验一 顺序表与链表 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、对线性表相应算法的时间复杂度进行分析。 4、理解顺序表、链表数据结构的特点。 二、实验预习 说明以下概念 1、线性表: 2、顺序表: 3、链表: 三、实验内容和要求 1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 #include #include #define ERROR 0 #defin
2、e OK 1 #define INIT_SIZE 5/*初始分配的顺序表长度*/ #define INCREM 5/*溢出时,顺序表长度的增量*/ typedef int ElemType; /*定义表元素的类型*/ typedef struct Sqlist ElemType *slist; /*存储空间的基地址*/ int length;/*顺序表的当前长度*/ int listsize; /*当前分配的存储空间*/ Sqlist; int InitList_sq(Sqlist *L); /*/ int CreateList_sq(Sqlist *L,int n); /*/ int Lis
3、tInsert_sq(Sqlist *L,int i,ElemType e);/* */ int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/ int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/ int ListLocate(Sqlist *L,ElemType e); /*查找值为e的元素*/ 2 int InitList_sq(Sqlist *L) L-slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType);if(!L-slist) return ERROR;L-leng
4、th=0;L-listsize=INIT_SIZE; return OK; /*InitList*/ int CreateList_sq(Sqlist *L,int n)ElemType e;int i; for(i=0;iprintf(scanf(if(!ListInsert_sq(L,i+1,e) return ERROR; return OK; /*CreateList*/ /*输出顺序表中的元素*/ int PrintList_sq(Sqlist *L)int i; for(i=1;ilength;i+) printf(return OK; /*PrintList*/ int List
5、Insert_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; for(k=L-length-1;k=i-1;k-)L-slistk+1= L-slistk; L-slisti-1=e;3 L-length+; return OK
6、; /*ListInsert*/ /*在顺序表中删除第i个元素*/ int ListDelete_sq(Sqlist *L,int i) /*在顺序表中查找指定值元素,返回其序号*/ int ListLocate(Sqlist *L,ElemType e) int main()Sqlist sl;int n,m,k; printf(输入顺序表的元素个数*/scanf(if(n0) printf(InitList_sq(&sl); CreateList_sq(&sl,n); printf(PrintList_sq(&sl); printf(scanf(ListInsert_sq(&sl,m,k)
7、; printf(PrintList_sq(&sl); printf(else printf(return 0; ? 运行结果? 算法分析4 2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。 删除算法代码: ? 运行结果? 算法分析查找算法代码: ? 运行结果? 算法分析5 3、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 #include #include #define ERROR 0 #define OK 1 typedef int ElemType; /*定义表元素的类型*/ typedef struct LNode /*线性表的单链表存储
8、*/ElemType data; struct LNode *next; LNode,*LinkList; LinkList CreateList(int n); /*/ void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/ int GetElem(LinkList L,int i,ElemType *e); /*/ LinkList CreateList(int n)LNode *p,*q,*head;int i; head=(LinkList)malloc(sizeof(LNode);head-next=NULL;p=head; for(i=0;iq
9、=(LinkList)malloc(sizeof(LNode);printf(data %i:scanf(输入元素值*/q-next=NULL; /*结点指针域置空*/p-next=q; /*新结点连在表末尾*/p=q; return head; /*CreateList*/ int InsertList(LinkList L, ElemType e, int i) /Insert before ith element LNode* p = L; int j = 0; while(p & jnext; j+; if(!p | ji) return ERROR; LNode* s = (Link
10、List) malloc(sizeof(LNode); s-data = e; s-next = p-next; 6 p-next = s; return OK; int DeleteList(LinkList L, ElemType& e, int i) /删除第i个元素,并e返回其值 LNode* p = L; int j = 0; while(p-next & jnext; j+; if(!(p-next) & j next; p-next = q-next; e = q-data; free(q); return OK; void PrintList(LinkList L)LNode
11、*p; p=L-next; /*p指向单链表的第1个元素*/while(p!=NULL) printf(p=p-next; /*PrintList*/ int GetElem(LinkList L,int i,ElemType *e)LNode *p;int j=1;p=L-next; while(p&jnext;j+; if(!p|ji) return ERROR;*e=p-data; return OK; /*GetElem*/ int main() int n,i;ElemType e; LinkList L=NULL;/*定义指向单链表的指针*/ 7 printf(输入单链表的元素个数
12、*/scanf(if(n0) printf(L=CreateList(n); printf(PrintList(L);printf(printf(scanf(if(GetElem(L,i,&e) printf(else printf(else printf(return 0; ? 运行结果 ? 算法分析 4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。 插入算法代码: ? 运行结果 8 ? 算法分析 删除算法代码: ? 运行结果 ? 算法分析以下为选做实验: 5、循环链表的应用 n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述
13、过程,直至表中只剩下一个元素。 提示:用一个无头结点的循环单链表来实现n个元素的存储。 ? 算法代码 9 6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。 提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至pnull为至,既完成了对整个链表元素的删除相同值。 ? 算法代码 四、实验小结 五、教师评语 10 实验二 栈和队列 一、实验目的 1、掌握栈的结构特性及其入栈,出栈操作; 2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。 二、实验预习 说明以下概
14、念 1、顺序栈: 2、链栈: 3、循环队列: 4、链队 三、实验内容和要求 1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。 #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ typedef structElemType *base;ElemType *top; in
15、t stacksize;/*当前已分配的存储空间*/ 11 SqStack; int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType e); /*入栈*/ int Pop(SqStack *S,ElemType *e); /*出栈*/ int CreateStack(SqStack *S);/*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ int InitStack(SqStack *S) S-base=(ElemType *)malloc(STACK_INT_SIZE
16、 *sizeof(ElemType);if(!S-base) return ERROR;S-top=S-base; S-stacksize=STACK_INT_SIZE;return OK; /*InitStack*/ int Push(SqStack *S,ElemType e) /*Push*/ int Pop(SqStack *S,ElemType *e)/*Pop*/ int CreateStack(SqStack *S)int e; if(InitStack(S) printf(else printf(return ERROR; printf(while(scanf(Push(S,e
17、);return OK; /*CreateStack*/ void PrintStack(SqStack *S)ElemType e; while(Pop(S,&e) printf(/*Pop_and_Print*/ 12 int main()SqStack ss; printf(CreateStack(&ss); printf(PrintStack(&ss);return 0; ? 算法分析:输入元素序列1 2 3 4 5,为什么输出序列为5 4 3 2 1?体现了栈的什么特性? 2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数,并验证其正确性。 ? 实现代码 int de
18、cToBin(int x) Return y; ? 验证3、阅读并运行程序,并分析程序功能。 #include #include #include #define M 20 #define elemtype char typedef struct elemtype stackM;int top; stacknode; 13 void init(stacknode *st); void push(stacknode *st,elemtype x); void pop(stacknode *st); void init(stacknode *st) st-top=0; void push(stac
19、knode *st,elemtype x) if(st-top=M) printf(else st-top=st-top+1; st-stackst-top=x; void pop(stacknode *st) if(st-top0) st-top-; else printf(“Stack is Empty!n”); int main() char sM;int i; stacknode *sp; printf(sp=(stacknode*)malloc(sizeof(stacknode);init(sp); printf(gets(s); for(i=0;iif(si=() push(sp,
20、si); if(si=) pop(sp); if(sp-top=0) printf(else printf(return 0; ? ? ? ? ? 输入:2+(c-d)*6-(f-7)*a)/6 运行结果: 输入:a-(c-d)*6-(s/3-x)/2 运行结果: 程序的基本功能: 14 以下为选做实验: 4、假设一带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,试编写相应的置空队列、入队列、出队列的算法。 实现代码:四、实验小结 五、教师评语 15 void tdfs(graph *g); /*深度优先搜索整个图*/ void bfs(int k,graph *g);/*从第k个顶
21、点广度优先搜索*/ void tbfs(graph *g); /*广度优先搜索整个图*/ void init_visit();/*初始化访问标识数组*/ void createGraph(graph *g) /*建立一个无向图的邻接矩阵*/ int i,j;char v; g-vexnum=0;g-arcnum=0;i=0; printf(输入顶点序列(以#结束):nwhile(v=getchar()!=#) g-vexsi=v;/*读入顶点信息*/ i+; g-vexnum=i; /*顶点数目*/ for(i=0;ivexnum;i+) /*邻接矩阵初始化*/ for(j=0;jvexnum
22、;j+) g-arcsij=0; printf(输入边的信息:nscanf(读入边i,j*/ while(i!=-1)/*读入i,j为1时结束*/ g-arcsij=1; g-arcsji=1; scanf( void dfs(int i,graph *g) /*从第i个顶点出发深度优先搜索*/ int j; printf(visitedi=TRUE; for(j=0;jvexnum;j+) if(g-arcsij=1)&(!visitedj) dfs(j,g); void tdfs(graph *g) /*深度优先搜索整个图*/ int i; 26 printf(从顶点%C开始深度优先搜索序
23、列:for(i=0;ivexnum;i+) if(visitedi!=TRUE) dfs(i,g); void bfs(int k,graph *g) /*从第k个顶点广度优先搜索*/ int i,j; queue qlist,*q;q=&qlist;q-rear=0;q-front=0; printf(visitedk=TRUE;q-dataq-rear=k;q-rear=(q-rear+1)%N;while(q-rear!=q-front) i=q-dataq-front; q-front=(q-front+1)%N; for(j=0;jvexnum;j+) if(g-arcsij=1)&
24、(!visitedj) printf( visitedj=TRUE; q-dataq-rear=j; q-rear=(q-rear+1)%N; void tbfs(graph *g) /*广度优先搜索整个图*/ int i; printf(从顶点%C开始广度优先搜索序列:for(i=0;ivexnum;i+) if(visitedi!=TRUE) bfs(i,g); void init_visit() /*初始化访问标识数组*/ int i; 27 for(i=0;ivisitedi=FALSE; int main() graph ga;int i,j; createGraph(&ga); p
25、rintf(无向图的邻接矩阵:nfor(i=0;ifor(j=0;j printf(printf( init_visit();tdfs(&ga);init_visit();tbfs(&ga);return 0; ? 根据右图的结构验证实验,输入: ABCDEFGH# 0,1 0 0,2 0,5 1 B 1,3 1,4 4 E 3 D 2,5 2,6 7 H 3,7 4,7 -1,-1 ? 运行结果: 2、阅读并运行下面程序,补充拓扑排序算法。 #include #include #define N 20 A C 2 F 5 G 6 28 typedef struct edgenode /*图的
26、邻接表:邻接链表结点*/int adjvex; /*顶点序号*/ struct edgenode *next; /*下一个结点的指针*/ edgenode; typedef struct vnode /*图的邻接表:邻接表*/char data;/*顶点信息*/int ind; /*顶点入度*/ struct edgenode *link; /*指向邻接链表指针*/ vnode; void createGraph_list(vnode adjlist,int *p); /*建立有向图的邻接表*/ void topSort(vnode g,int n); /*拓扑排序*/ void create
27、Graph_list(vnode adjlist,int *p) /*建立有向图的邻接表*/int i,j,n,e;char v; edgenode *s;i=0;n=0;e=0; printf(输入顶点序列(以#结束):nwhile(v=getchar()!=#) adjlisti.data=v;/*读入顶点信息*/ adjlisti.link=NULL; adjlisti.ind=0; i+;n=i;*p=n; /*建立邻接链表*/ printf(请输入弧的信息(i=-1结束):i,j:nscanf(while(i!=-1) s=(struct edgenode*)malloc(sizeof(edgenode); s-adjvex=j; s-next=adjlisti.link; adjlisti.link=s; adjlistj.ind+; /*顶点j的入度加1*/ e+; scanf( printf(邻接表:for(i=0;iprintf(29 s=adjlisti.link; while(s!=NULL) printf(s=s-next; void topSort(vnode g,int n) /*拓扑排序*/ int main() vnode adjlistN;int n,*p;p=&n; createGraph_list(adj
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1