数据结构课程设计实验1 4(C语言)

合集下载

数据结构的课程设计

数据结构的课程设计

数据结构的课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点与应用场景。

2. 学会分析不同数据结构的存储方式和操作方法,并能运用到实际问题的解决中。

3. 掌握排序和查找算法的基本原理,了解其时间复杂度和空间复杂度。

技能目标:1. 能够运用所学数据结构知识,解决实际问题,提高编程能力。

2. 能够运用排序和查找算法,优化程序性能,提高解决问题的效率。

3. 能够运用数据结构知识,分析并解决复杂问题,培养逻辑思维能力和创新意识。

情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。

2. 增强学生的团队协作意识,培养合作解决问题的能力,提高沟通表达能力。

3. 培养学生的抽象思维能力,使其认识到数据结构在计算机科学中的重要性,激发对计算机科学的热爱。

本课程针对高中年级学生,结合学科特点和教学要求,注重理论与实践相结合,培养学生的编程能力和逻辑思维能力。

通过本课程的学习,使学生能够掌握数据结构的基本知识,提高解决实际问题的能力,同时培养良好的学习态度和价值观。

在教学过程中,将目标分解为具体的学习成果,以便进行后续的教学设计和评估。

二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构(线性表、栈、队列)和非线性结构(树、图)的特点。

2. 线性表:讲解线性表的顺序存储和链式存储结构,以及相关操作(插入、删除、查找等)。

3. 栈和队列:介绍栈和队列的应用场景、存储结构及相关操作。

4. 树和二叉树:讲解树的定义、性质、存储结构,二叉树的遍历算法及线索二叉树。

5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表)、图的遍历算法(深度优先搜索和广度优先搜索)。

6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理、实现及性能分析。

7. 查找算法:介绍线性查找、二分查找等查找算法的原理及实现。

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)数据结构基础及深入及考试习题及实验参考答案见附录结论1、数据的逻辑结构是指数据元素之间的逻辑关系。

即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。

它依赖于计算机。

存储结构可分为4大类:顺序、链式、索引、散列3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。

它由基本的数据类型构成,并包括一组相关的服务(或称操作)。

它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。

4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。

5、在数据结构中,从逻辑上可以把数据结构分成(C)A、动态结构和表态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构6、算法的时间复杂度取决于(A)A、问题的规模B、待处理数据的初态C、问题的规模和待处理数据的初态线性表1、线性表的存储结构包括顺序存储结构和链式存储结构两种。

2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为(E),删除一个元素需要移动的元素的个数为(A)。

A、(n-1)/2B、nC、n+1D、n-1E、n/2F、(n+1)/2G、(n-2)/23、“线性表的逻辑顺序与存储顺序总是一致的。

”这个结论是(B)A、正确的B、错误的C、不一定,与具体的结构有关4、线性表采用链式存储结构时,要求内存中可用存储单元的地址(D)A、必须是连续的B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以5、带头结点的单链表为空的判定条件是(B)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL6、不带头结点的单链表head为空的判定条件是(A)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL7、非空的循环单链表head的尾结点P满足(C)A、p->ne某t==NULLB、p==NULLC、p->ne某t==headD、p==head8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是(B)A、O(1)B、O(n)C、O(n2)D、O(nlog2n)数据结构(第4版)习题及实验参考答案9、在一个单链表中,若删除p所指结点的后继结点,则执行(A)A、p->ne某t=p->ne某t->ne某t;B、p=p->ne某t;p->ne某t=p->ne某t->ne某t;C、p->ne某t=p->ne某t;D、p=p->ne某t->ne某t;10、在一个单链表中,若在p所指结点之后插入所指结点,则执行(B)A、->ne某t=p;p->ne某t=;B、->ne某t=p->ne某t;p->ne某t=;C、->ne某t=p->ne某t;p=;D、p->ne某t=;->ne某t=p;11、在一个单链表中,已知q是p的前趋结点,若在q和p之间插入结点,则执行(C)A、->ne某t=p->ne某t;p->ne某t=;B、p->ne某t=->ne某t;->ne某t=p;C、q->ne某t=;->ne某t=p;D、p->ne某t=;->ne某t=q;12、在线性结构中,第一个结点没有前趋结点,其余每个结点有且只有1个前趋结点。

C语言与数据结构实验指导

C语言与数据结构实验指导

C语⾔与数据结构实验指导Harbin Institute of TechnologyC语⾔与数据结构实验指导书刘梅索莹⽥⽂龙哈⼯⼤电⼦与信息⼯程学院电⼦⼯程系实验1 实验平台⼀、实验⽬的1.掌握Microsoft Visual C++ 6.0集成环境的使⽤⽅法。

2.掌握C程序在Microsoft Visual C++ 6.0开发环境中的编辑、编译、链接和运⾏全过程⼆、实验内容1)启动Microsoft Visual C++ 6.0开发环境双击桌⾯应⽤程序图标或“开始”菜单程序组中的Microsoft Visual C++ 6.0应⽤程序,启动VC++,如图所⽰图1.1 VC++初始界⾯2)建⽴C源程序⽂件⽅法1:单击⼯具栏的“新建⽂本⽂件”按钮,打开⽂本⽂件编辑界⾯如下图所⽰图1.2 ⽂本⽂件编辑界⾯⽅法2:执⾏“⽂件”->“新建”命令,如图1.3所⽰,在“⽂件”选项卡下选择C++ Source File ⽂件类型,然后输⼊C源程序⽂件名和保存⽂件,如图1.3所⽰,然后单击“确定”按钮,打开源程序⽂件编辑界⾯,如图1.4所⽰。

注意:输⼊C源程序⽂件名时必须带上扩展“.c”,否则默认创建的是扩展名为“.cpp”的C++⽂件。

3)编辑源⽂件⽅法1:在如图1.2所⽰的⽂本⽂件编辑界⾯中输⼊源程序代码,如图1.5所⽰。

⽅法2:在如图1.4所⽰的C源程序⽂件编辑界⾯中编辑源程序代码,如图1.6所⽰。

图1.3 新建⽂件图1.4 C源程序⽂件编辑界⾯图1.5 ⽂本⽂件编辑界⾯编辑源⽂件图1.6 C源程序编辑界⾯编辑源⽂件4)保存源⽂件源⽂件编辑结束后,执⾏“⽂件”->“保存”命令保存⽂件,⽂本⽂件编辑界⾯中编辑的源⽂件保存时必须在⽂件名后加上扩展名“.c”,否则保存的是扩展名为txt的⽂本⽂件,不能编译运⾏。

5)组件⽂件执⾏“组建”->“组建”命令或直接按F7功能键或单机⼯具栏Build按钮,可以对源⽂件进⾏编译、链接⽽不运⾏该程序。

c与数据结构课程设计

c与数据结构课程设计

c与数据结构课程设计一、教学目标本课程的教学目标是使学生掌握C语言编程基础及其在数据结构中的应用。

具体目标如下:1.知识目标:–理解C语言的基本语法、数据类型、运算符、控制结构。

–掌握函数的定义、调用和参数传递。

–了解数据结构的基本概念,包括线性表、栈、队列、树、图等。

–理解算法的基本概念,能够分析算法的时间和空间复杂度。

2.技能目标:–能够使用C语言编写简单的程序,对数据进行处理和分析。

–能够运用数据结构解决实际问题,提高程序的效率和可维护性。

–掌握算法的设计和分析方法,能够编写高效的程序。

3.情感态度价值观目标:–培养学生的编程兴趣,提高学生解决实际问题的能力。

–培养学生团队合作的精神,提高学生的沟通和协作能力。

–培养学生勇于探索、不断创新的精神,提高学生的自主学习能力。

二、教学内容本课程的教学内容主要包括C语言基础、数据结构及其在C语言中的应用。

具体安排如下:1.C语言基础:–基本语法、数据类型、运算符、控制结构。

–函数的定义、调用和参数传递。

–指针的概念和应用。

2.数据结构:–线性表的顺序存储和链式存储。

–栈和队列的定义、实现及其应用。

–树的基本概念、二叉树的遍历和应用。

–图的定义、遍历算法和应用。

3.数据结构在C语言中的应用:–排序算法及其实现。

–查找算法及其实现。

–动态规划算法及其应用。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

具体安排如下:1.讲授法:用于讲解C语言基础知识和数据结构的基本概念。

2.案例分析法:通过分析实际案例,使学生掌握数据结构在C语言中的应用。

3.实验法:让学生动手编写程序,巩固所学知识,提高实际编程能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

具体安排如下:1.教材:选用《C程序设计语言》作为主教材,辅助以《数据结构与算法分析》等参考书。

2.多媒体资料:提供PPT、视频教程等资料,帮助学生更好地理解课程内容。

C语言数据结构线性表的基本操作实验报告

C语言数据结构线性表的基本操作实验报告

实验一线性表的基本操作一、实验目的与基本要求1.掌握数据结构中的一些基本概念。

数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。

2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。

3.掌握顺序表和链表的基本操作:插入、删除、查找以及表的合并等运算。

4.掌握运用C语言上机调试线性表的基本方法。

二、实验条件1.硬件:一台微机2.软件:操作系统和C语言系统三、实验方法确定存储结构后,上机调试实现线性表的基本运算。

四、实验内容1.建立顺序表,基本操作包括:初始化,建立一个顺序存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。

2.建立单链表,基本操作包括:初始化,建立一个链式存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。

3.假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。

编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。

(可以利用将B中元素插入A中,或新建C表)4.假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。

编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。

五、附源程序及算法程序流程图1.源程序(1)源程序(实验要求1和3)#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct arr{int * elem;int length;int listsize;}Sqlist;void menu(); //菜单void InitList(Sqlist *p); // 创建线性表void ShowList(Sqlist *p); // 输出顺序线性表void ListDelete(Sqlist *p,int i,int &e); // 在顺序线性表中删除第i个元素,并用e返回其值void ListInsert(Sqlist *p); // 在顺序线性表中第i个元素前插入新元素evoid ListEmpty(Sqlist *p); // 判断L是否为空表void GetList(Sqlist *p,int i,int &e); // 用e返回L中第i个数据元素的值void ListInsert(Sqlist *p,int i,int e);bool compare(int a,int b);void LocateElem(Sqlist *L,int e); // 在顺序线性表L中查找第1个值与e满足compare()d元素的位序void MergeList_L(Sqlist *La,Sqlist *Lb); // 归并void main(){Sqlist La;Sqlist Lb;int n,m,x;menu();scanf("%d",&n);while(n){switch(n){case 0: ; break;case 1:InitList(&La);break;case 2:ListEmpty(&La);break;case 3:printf("请输入插入的位序:\n");scanf("%d",&m);printf("请出入要插入的数:\n");scanf("%d",&x);ListInsert(&La,m,x);break;case 4:printf("请输入删除元素的位序:\n");scanf("%d",&m);ListDelete(&La,m,x);printf("删除的元素为:%d\n",x);break;case 5:printf("请输入要找的与线性表中相等的数:\n");scanf("%d",&m);LocateElem(&La,m);break;case 6:printf("请输入查找的位序:\n");scanf("%d",&m);GetList(&La,m,x);printf("La中第%d个元素的值为%d\n",m,x);break;case 7:ShowList(&La);break;case 8:InitList(&Lb);break;case 9:MergeList_L(&La,&Lb);printf("归并成功!");break;}menu();scanf("%d",&n);}}/*菜单*/void menu(){printf("********************\n\n");printf(" 0.退出\n\n");printf(" 1.创建线性表La\n\n");printf(" 2.判断La是否为空表\n\n");printf(" 3.插入元素(La)\n\n");printf(" 4.删除元素(La)\n\n");printf(" 5.定位元素(La)\n\n");printf(" 6.取元素(La)\n\n");printf(" 7.输出线性表\n\n");printf(" 8.创建线性表Lb\n\n");printf(" 9.归并为一个线性表La\n\n");printf("********************\n\n");}/*创建顺序线性表L*/void InitList(Sqlist *L){int n;int i=0;L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));if(NULL==L->elem)printf("储存分配失败!\n");else{L->length=0;L->listsize=LIST_INIT_SIZE;printf("输入顺序表a:\n");scanf("%d",&n);while(n){L->elem[i]=n;i++;L->length++;L->listsize=L->listsize-4;scanf("%d",&n);}}}/*输出顺序线性表*/void ShowList(Sqlist *p){int i;if(0==p->length)printf("数组为空!\n");elsefor(i=0;i<p->length;i++)printf("%d ",p->elem[i]);printf("\n");}/*判断L是否为空表*/void ListEmpty(Sqlist *p)if(0==p->length)printf("L是空表!\n");elseprintf("L不是空表!\n");}/*在顺序线性表中第i个元素前插入新元素e */void ListInsert(Sqlist *p,int i,int e){int *newbase;int *q1;int *q2;while(i<1||i>p->length+1){printf("您输入的i超出范围!\n请重新输入要插入的位置\n:");scanf("%d",&i);}if(p->length>=p->listsize){newbase=(int *)realloc(p->elem,(p->listsize+LISTINCREMENT)*sizeof(int));if(!newbase)exit(0);else{p->elem=newbase;p->listsize+=LISTINCREMENT;}}q1=&(p->elem[i-1]);for(q2=&(p->elem[p->length-1]);q2>=q1;--q2)*(q2+1)=*q2;*q1=e;++p->length;}/*/在顺序线性表中删除第i个元素,并用e返回其值*/void ListDelete(Sqlist *p,int i,int &e){int *q1,*q2;while(i<1||i>p->length){printf("您输入的i超出范围!请重新输入:");scanf("%d",&i);}q1=&(p->elem[i-1]);e=*q1;q2=p->elem+p->length-1;for(++q1;q1<=q2;++q1)*(q1-1)=*q1;--p->length;}/*对比a与b相等*/bool compare(int a,int b){if(a==b)return 1;elsereturn 0;}/*在顺序线性表L中查找第1个值与e满足compare()d元素的位序*/ void LocateElem(Sqlist *L,int e){int i=1;int *p;p=L->elem;while(i<=L->length && !compare(*p++,e))++i;if(i<=L->length)printf("第1个与e相等的元素的位序为%d\n",i);elseprintf("没有该元素!\n");}/*用e返回L中第i个数据元素的值*/void GetList(Sqlist *p,int i,int &e){Sqlist *p1;p1=p;e=p1->elem[i-1];}/* 已知顺序线性表La和Lb是元素按值非递减排列*//* 把La和Lb归并到La上,La的元素也是按值非递减*/void MergeList_L(Sqlist *La,Sqlist *Lb){int i=0,j=0,k,t;int *newbase;Sqlist *pa,*pb;pa=La;pb=Lb;while(i<pa->length && j<pb->length){if(pa->elem[i] >= pb->elem[j]){if(pa->listsize==0){newbase=(int*)realloc(pa->elem,(pa->listsize+LISTINCREMENT)*sizeof(int));if(!newbase)exit(0);}for(k=pa->length-1; k>=i; k--)pa->elem[k+1]=pa->elem[k];pa->length++;pa->elem[i]=pb->elem[j];i++;j++;}elsei++;}while(j<pb->length){if( pa->listsize < pb->length-j ){newbase=(int*)realloc(pa->elem,(pa->listsize+LISTINCREMENT)*sizeof(int));if(!newbase)exit(0);}for(j;j<pb->length;j++,i++){pa->elem[i]=pb->elem[j];pa->length++;}}for(i=0;i<pa->length/2;i++){t=pa->elem[i];pa->elem[i]=pa->elem[pa->length-i-1];pa->elem[pa->length-i-1]=t;}}(2)源程序(实验要求2和4)#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct LNode{int data;struct LNode *next;}LNode, *LinkList;void menu();LinkList InitList();void ShowList(LinkList L);void ListDelete(LinkList L,int i,int &e);void ListEmpty(LinkList L);void GetList(LinkList L,int i,int &e);void ListInsert(LinkList L,int i,int e);bool compare(int a,int b);void LocateElem(LinkList L,int e);LinkList MergeList_L(LinkList La,LinkList Lb);int total=0;void main(){LinkList La;LinkList Lb;La=(LinkList)malloc(sizeof(struct LNode));La->next=NULL;Lb=(LinkList)malloc(sizeof(struct LNode));Lb->next=NULL;int n;int m;int x;menu();scanf("%d",&n);while(n){switch(n){case 0: ; break;case 1:La->next=InitList();break;case 2:ListEmpty(La);break;case 3:printf("请输入要插入到第几个节点前:\n");scanf("%d",&m);printf("请输入插入的数据:\n");scanf("%d",&x);ListInsert(La,m,x);break;case 4:printf("请输入删除元素的位序:\n");scanf("%d",&m);ListDelete(La,m,x);printf("删除的元素为:%d\n",x);break;case 5:printf("请输入要找的与线性表中相等的数:\n");scanf("%d",&m);LocateElem(La,m);break;case 6:printf("请输入查找的位序:\n");scanf("%d",&m);GetList(La,m,x);printf("La中第%d个元素的值为%d\n",m,x);break;case 7:ShowList(La);break;case 8:Lb->next=InitList();break;case 9:La=MergeList_L(La,Lb);printf("归并成功\n");break;}menu();scanf("%d",&n);}}void menu(){printf("********************\n\n");printf(" 0.退出\n\n");printf(" 1.创建线性表La\n\n");printf(" 2.判断是否为空表\n\n");printf(" 3.插入元素\n\n");printf(" 4.删除元素\n\n");printf(" 5.定位元素\n\n");printf(" 6.取元素\n\n");printf(" 7.输出线性表\n\n");printf(" 8.创建线性表Lb\n\n");printf(" 9.归并两线性表\n\n");printf("********************\n\n");}// 创建链式线性表LLinkList InitList(){int count=0;LinkList pHead=NULL;LinkList pEnd,pNew;pEnd=pNew=(LinkList)malloc(sizeof(struct LNode));printf("请输入数据:\n");scanf("%d",&pNew->data);while(pNew->data){count++;if(count==1){pNew->next=pHead;pEnd=pNew;pHead=pNew;}else{pNew->next=NULL;pEnd->next=pNew;pEnd=pNew;}pNew=(LinkList)malloc(sizeof(struct LNode));printf("请输入数据:\n");scanf("%d",&pNew->data);}free(pNew);total=total+count;return pHead;}// 判断L是否为空表void ListEmpty(LinkList L){if(NULL==L->next)printf("此表为空表!\n");elseprintf("此表不为空表!\n");}// 在链式线性表中第i个元素前插入新元素e void ListInsert(LinkList L,int i,int e){LinkList p;LinkList s;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)printf("不存在您要找的节点!\n");else{s=(LinkList)malloc(sizeof(int));s->data=e;s->next=p->next;p->next=s;printf("插入节点成功!\n");}}// 输出链式线性表void ShowList(LinkList L){LinkList p;p=L->next;if(p==NULL)printf("此表为空表!\n");elsewhile(p){printf("%d ",p->data);p=p->next;}printf("\n");}// 在链式线性表中删除第i个元素,并用e返回其值void ListDelete(LinkList L,int i,int &e){LinkList p;LinkList q;p=L;int j=0;while(p->next && j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)printf("没有找到要删除的位置!");else{q=p->next;p->next=q->next;e=q->data;free(q);}}// 用e返回L中第i个数据元素的值void GetList(LinkList L,int i,int &e){LinkList p;p=L->next;int j=0;while(p->next && j<i-1){p=p->next;++j;}if(!(p)||j>i-1)printf("没有找到要查找的位置!");elsee=p->data;}// 对比a与b相等bool compare(int a,int b){if(a==b)return 1;elsereturn 0;}// 在链式线性表L中查找第1个值与e满足compare()d元素的位序void LocateElem(LinkList L,int e){int i=0;LinkList p;p=L;while(p->next && !compare(p->data,e)){p=p->next;i++;}if(NULL==p->next){if(0==compare(p->data,e))printf("没有该元素!\n");elseprintf("第1个与e相等的元素的位序为%d\n",i);}elseif(compare(p->data,e))printf("没有该元素!\n");}LinkList MergeList_L(LinkList La,LinkList Lb){int i,j,k;LinkList pa_1,pb_1,pa_2,pb_2,pc,pd;pa_1=La->next;pc=pa_2=La;pb_1=pb_2=Lb->next;if(pa_1->data > pb_1->data){pc=pa_2=Lb;pa_1=Lb->next;pb_1=pb_2=La->next;}while(pa_1 && pb_1){if(pa_1->data >= pb_1->data){pa_2->next=pb_1;pb_2=pb_1->next;pb_1->next=pa_1;pb_1=pb_2;pa_2=pa_2->next;}else{pa_1=pa_1->next;pa_2=pa_2->next;}}if(pb_1)pa_2->next=pb_1;pd=(LinkList)malloc(sizeof(struct LNode));pd->next=NULL;pa_2=pd;k=total;for(i=0;i<total;i++){pa_1=pc->next;for(j=1;j<k;j++)pa_1=pa_1->next;pb_1=(LinkList)malloc(sizeof(struct LNode));pa_2->next=pb_1;pa_2=pa_2->next;pa_2->data=pa_1->data;k--;}pa_2->next=NULL;return pd;}2.流程图(实验要求1和3)图1 主函数流程图图2创建线性表La流程图图3判断La是否为空表流程图图4 插入元素(La)流程图图5删除元素(La)流程图图6定位元素(La)流程图图7取元素(La)流程图图8输出线性表流程图图9输出线性表流程图流程图(实验要求2和4)图10主函数流程图图11创建线性表La流程图图12判断是否为空表流程图图13插入元素流程图图14删除元素流程图图15定位元素流程图图图16取元素流程图图17创建Lb流程图图18归并两表流程图六、运行结果1. (实验要求1和3)点击运行,首先出现的是菜单界面,选择菜单选项进行操作,如图所示。

数据结构(C语言版)习题参考答案

数据结构(C语言版)习题参考答案

数据结构(C语言版)习题参考答案数据结构(C语言版)习题参考答案1. 数据结构简介数据结构是计算机科学中重要的概念之一,它关注如何组织和存储数据,以便有效地进行访问和操作。

C语言是一种广泛应用于数据结构实现的编程语言。

本文将提供一些常见数据结构习题的参考答案,帮助读者理解和掌握数据结构的基本概念与实现。

2. 数组数组是一种线性结构,存储具有相同数据类型的元素。

以下是一些数组习题的参考答案:2.1 统计数组中某个元素出现的次数```int countOccurrences(int arr[], int n, int x) {int count = 0;for (int i = 0; i < n; i++) {if (arr[i] == x) {count++;}}return count;}```2.2 查找数组中的最大值和最小值```void findMinMax(int arr[], int n, int* min, int* max) { *min = arr[0];*max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] < *min) {*min = arr[i];}if (arr[i] > *max) {*max = arr[i];}}}```3. 链表链表是一种动态数据结构,每个节点包含数据和指向下一个节点的指针。

以下是一些链表习题的参考答案:3.1 反转链表```Node* reverseLinkedList(Node* head) {Node* prev = NULL;Node* curr = head;while (curr != NULL) {Node* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}```3.2 合并两个有序链表```Node* mergeLists(Node* list1, Node* list2) {if (list1 == NULL) {return list2;}if (list2 == NULL) {return list1;}if (list1->data < list2->data) {list1->next = mergeLists(list1->next, list2);return list1;} else {list2->next = mergeLists(list1, list2->next);return list2;}}```4. 栈和队列栈和队列是两种重要的线性数据结构,栈支持后进先出(LIFO),队列支持先进先出(FIFO)。

数据结构教案C语言版

数据结构教案C语言版

课程教案课程名称:数据结构授课教师:学习对象:任课时间:一、学生情况分析数据结构是计算机专业的一门核心专业课程。

学生在前期的学习中已经学习了C语言程序设计课程。

通过本课程学习使学生对提高编写程序的能力以及解决实际问题的能力。

二、课程教学目标《数据结构》是计算机学科中一门核心专业基础课。

主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法的分析和评价。

通过本课程的学习,使学生深透地理解数据结构的逻辑结构和物理结构的基本概念以及有关算法,培养基本的、良好的程序设计技能,编制高效可靠的程序,为学习操作系统、编译原理和数据库等课程奠定基础。

三、课程教学内容第一章绪论教学内容:1)什么是数据结构2)抽象数据类型概念;数据类型;数据抽象与抽象数据类型;用于描述数据结构的语言3)数据结构的抽象层次4)算法定义5)性能分析与度量;算法的性能标准;算法的后期测试;算法的事前估计;空间复杂度度量;时间复杂度度量;时间复杂度的渐进表示法;教学要求:了解:数据结构基本概念及数据结构的抽象层次了解:抽象数据类型概念了解:算法的定义及算法特性掌握:算法的性能分析与度量方法第二章线性表教学内容:1)线性表的定义和特点2)线性表的顺序存储及查找、插入和删除操作3)线性表的链式存储及查找、插入和删除操作4)使用线性表的实例教学要求:了解:线性表的定义和特点熟练掌握:线性表的顺序存储结构的查找、插入和删除等基本操作熟练掌握:单链表、循环链表及双向链表的定义及实现掌握:熟练掌握单链表的应用方法第三章栈和队列教学内容:1)栈:栈的抽象数据类型;栈的顺序存储表示;栈的链式存储表示2)队列:队列的抽象数据类型;队列的顺序存储表示;队列的链式存储表示3)队列的应用举例教学要求:熟练掌握:栈的定义及实现熟练掌握:队列的定义及实现掌握:能运用栈和队列解决简单实际问题教学:内容:1)字符串的抽象数据类型2)字符串操作的实现3)字符串的模式匹配教学要求:熟练掌握:字符串的定义方式熟练掌握:字符串的各种操作的实现了解:字符串的模式匹配算法第五章数组和广义表教学:内容:1)数组的定义和初始化2)作为抽象数据类型的数组的顺序存储方式教学要求:了解:作为抽象数据类型的数组的定义熟练掌握:顺序表的数组定义方式及实现第六章树和二叉树教学内容:1)树和森林的概念:树的定义;树的术语;树的抽象数据类型;森林的概念2)二叉树:二叉树的定义;二叉树的性质;二叉树的抽象数据类型3)二叉树的表示:数组表示;链表存储表示4)二叉树的遍历:中序遍历;前序遍历;后序遍历;应用二叉树遍历的实例;二叉树的中序非递归算法5)线索化二叉树:线索;中序线索化二叉树;前序与后序的线索化6)树与森林:树的存储表示;森林与二叉树的转换;树的遍历;森林的遍历7)二叉树的计数8)霍夫曼树:路径长度;霍夫曼树;霍夫曼树编码教学要求:了解:树和森林的概念掌握:二叉树的概念、性质及二叉树的表示熟练掌握:二叉树的遍历方法掌握:线索化二叉树的特性及寻找某结点的前驱和后继的方法掌握:树和森林的实现及遍历方法掌握:二叉树的计数方法及从二叉树遍历结果得到二叉树的方法掌握:霍夫曼树的实现方法及霍夫曼编码的概念第七章图教学内容:1)图的基本概念:图的基本概念;图的抽象数据类型2)图的存储表示:邻接矩阵;邻接表;邻接多重表3)图的遍历与连通性;深度优先搜索;广度优先搜索;连通分量4)最小生成树:克鲁斯卡尔算法;普里姆算法教学要求:掌握:图的基本概念和图的存储表示熟练掌握:图的两种遍历方法与求解连通性问题的方法掌握:构造最小生成树的Prim和Kruskal方法教学内容:1)静态查找表:顺序表的查找;有序表的查找;索引顺序表的查找2)二叉排序树:二叉排序树上的搜索、插入和删除教学要求:熟练掌握:静态搜索表的顺序搜索和折半搜索方法熟练掌握:二叉搜索树的表示、搜索、插入、删除算法及其性能分析方法第十章内部排序教学内容:1)概述2)插入排序:直接插入排序;对分插入排序;链表插入排序;希尔排序3)选择排序:直接选择排序;堆排序教学要求:掌握:排序的基本概念和性能分析方法掌握:插入排序、选择排序、等内排序的方法及性能分析方法单元名称:第一讲:绪论一、教学目标1.了解《数据结构》课程的体系结构2.掌握本章介绍的各种基本概念和术语3.了解数据结构的二元组表示4.掌握逻辑结构与物理结构之间的映像关系。

数据结构课程设计四则运算表达式求值(C语言版)

数据结构课程设计四则运算表达式求值(C语言版)

数据结构课程设计四则运算表达式求值(C语⾔版) 明⼈不说暗话,直接上,输⼊提取码z3fy即可下载。

⽂件中包含程序,程序运⾏⽂件,设计报告和测试样例,应有尽有,欢迎⼩伙伴们在中下载使⽤。

本课程设计为四则运算表达式求值,⽤于带⼩括号的⼀定范围内正负数的四则运算标准(中缀)表达式的求值。

注意事项:1、请保证输⼊的四则表达式的合法性。

输⼊的中缀表达式中只能含有英⽂符号“+”、“-”、“*”、“/”、“(”、“)”、“=”、数字“0”到“9”以及⼩数点“.”,输⼊“=”表⽰输⼊结束。

例如9+(3-1)*3.567+10/2=,特别是请勿输⼊多余空格和中⽂左右括号。

2、输⼊的中缀表达式默认限定长度是1001,可根据具体情况调整字符串数组的长度。

3、请保证输⼊的操作数在double数据类型范围内,单个数字有效数字长度不可超过15位。

本课程设计中操作数是C语⾔中的双精度浮点数类型。

4、本课程设计中的运算数可以是负数,另外如果是正数可直接省略“+”号(也可带“+”号)。

 下⾯的程序正常运⾏需要在上⾯的百度⽹盘中下载相应⽂件,否则⽆法正常使⽤哦。

1/*本程序为四则运算表达式求值系统,⽤于计算带⼩括号的四则运算表达式求值。

2具体算法:3先将字符串处理成操作单元(操作数或操作符),再利⽤栈根据四则运算4的运算法则进⾏计算,最后得出结果。

*/56 #include<stdio.h>7 #include<ctype.h>8 #include<stdlib.h>9 #include<string.h>10 #include<stdlib.h>11 #include<ctype.h>1213const int Expmax_length = 1001;//表达式最⼤长度,可根据适当情况调整14struct Ope_unit15 {//定义操作单元16int flag;//=1表⽰是操作数 =0表⽰是操作符 -1表⽰符号单元17char oper;//操作符18double real;//操作数,为双精度浮点数19 };2021void Display();//菜单22void Instru(); //使⽤说明23int Check(char Exp_arry[]);24void Evalua(); //先调⽤Conver操作单元化,再调⽤Calculate函数计算结果并输出25int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[]);//将字符串处理成操作单元26int Isoper(char ch);//判断合法字符(+ - * / ( ) =)27int Ope_Compar(char ope1,char ope2);//操作符运算优先级⽐较28double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag);//⽤栈计算表达式结果29double Four_arithm(double x,double y,char oper);//四则运算3031int main()32 {33int select;34while(1)35 {36 Display();37 printf("请输⼊欲执⾏功能对应的数字:");38 scanf("%d",&select);39 printf("\n");40switch(select)41 {42case1: Evalua(); break;43case2: Instru(); break;44case0: return0;45default : printf("⽆该数字对应的功能,请重新输⼊\n");46 system("pause");47 }48 }49return0;50 }5152int Check(char Exp_arry[])53 {//检查是否有⾮法字符,返回1表⽰不合法,0表⽰合法54int Explength=strlen(Exp_arry),i;55for(i=0;i<Explength;i++)56 {57if(!Isoper(Exp_arry[i]) && Exp_arry[i] != '.' && !isdigit(Exp_arry[i]))58return1;59if(isdigit(Exp_arry[i]))60 {61int Dig_number=0,Cur_positoin=i+1;62while(isdigit(Exp_arry[Cur_positoin]) || Exp_arry[Cur_positoin]=='.')63 {64 Dig_number++;65 Cur_positoin++;66 }67if(Dig_number >= 16)//最多能够计算15位有效数字68return1;69 }70 }71return0;72 }7374void Evalua()75 {//先调⽤Conver函数将字符串操作单元化,再调⽤Calculate函数计算结果并输出76char Exp_arry[Expmax_length];77int flag=0;//假设刚开始不合法,1表达式合法,0不合法78struct Ope_unit Opeunit_arry[Expmax_length];7980 getchar();//吃掉⼀个换⾏符81 printf("请输⼊四则运算表达式,以=结尾:\n");82 gets(Exp_arry);83 flag=Check(Exp_arry);84if(flag)85 printf("该表达式不合法!\n");86else87 {88int Opeunit_count = Conver(Opeunit_arry,Exp_arry);89double ans = Calculate(Opeunit_arry,Opeunit_count,flag);90if(flag)91 {92 printf("计算结果为:\n");93 printf("%s%lf\n",Exp_arry,ans);94 }95else96 printf("该表达式不合法!\n");97 }98 system("pause");99 }100101int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[])102 {//将字符串操作单元化103int Explength=strlen(Exp_arry);104int i,Opeunit_count=0;105for(i=0;i<Explength;i++)106 {107if(Isoper(Exp_arry[i]))//是操作符108 {109 Opeunit_arry[Opeunit_count].flag=0;110 Opeunit_arry[Opeunit_count++].oper=Exp_arry[i];111 }112else//是操作数113 {114 Opeunit_arry[Opeunit_count].flag=1;115char temp[Expmax_length];116int k=0;117for(; isdigit(Exp_arry[i]) || Exp_arry[i]=='.' ;i++)118 {119 temp[k++]=Exp_arry[i];120 }121 i--;122 temp[k]='\0';123 Opeunit_arry[Opeunit_count].real=atof(temp);//将字符转化为浮点数124125//负数126if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0127 && Opeunit_arry[Opeunit_count-1].oper=='-')128 {129 Opeunit_arry[Opeunit_count-1].flag = -1;130 Opeunit_arry[Opeunit_count].real *= -1;131 }// -9132if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0133 && Opeunit_arry[Opeunit_count-1].oper=='-' && Opeunit_arry[Opeunit_count-2].flag==0 134 && Opeunit_arry[Opeunit_count-2].oper !=')')135 {136 Opeunit_arry[Opeunit_count-1].flag = -1;137 Opeunit_arry[Opeunit_count].real *= -1;138 }// )-9139140//正数141if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0142 && Opeunit_arry[Opeunit_count-1].oper=='+')143 {144 Opeunit_arry[Opeunit_count-1].flag = -1;145 }// +9146if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0147 && Opeunit_arry[Opeunit_count-1].oper=='+' && Opeunit_arry[Opeunit_count-2].flag==0148 && Opeunit_arry[Opeunit_count-2].oper !=')')149 {150 Opeunit_arry[Opeunit_count-1].flag = -1;151 }// )+9152 Opeunit_count++;153 }154 }155/*for(i=0;i<Opeunit_count;i++)156 {//查看各操作单元是否正确,1是操作数,0是操作符157 if(Opeunit_arry[i].flag == 1)158 printf("该单元是操作数为:%lf\n",Opeunit_arry[i].real);159 else if(Opeunit_arry[i].flag == 0)160 printf("该单元是操作符为:%c\n",Opeunit_arry[i].oper);161 else162 printf("该单元是负号符为:%c\n",Opeunit_arry[i].oper);163 }*/164return Opeunit_count;165 }166167double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag)168 {//根据运算规则,利⽤栈进⾏计算169int i,dS_pointer=0,oS_pointer=0;//dS_pointer为操作数栈顶指⽰器,oS_pointer为操作符栈顶指⽰器170double Dig_stack[Expmax_length];//操作数栈(顺序存储结构)171char Ope_stack[Expmax_length];//操作符栈172173for(i=0;i<Opeunit_count-1;i++)174 {175if( Opeunit_arry[i].flag != -1 )176 {177if(Opeunit_arry[i].flag)//是操作数178 {179 Dig_stack[dS_pointer++]=Opeunit_arry[i].real;//⼊操作数栈180//printf("%lf\n",Digit[dS_pointer-1]);181 }182else//是操作符 + - * / ( )183 {184//操作符栈为空或者左括号⼊栈185if(oS_pointer==0 || Opeunit_arry[i].oper=='(')186 {187 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;188//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);189 }190else191 {192if(Opeunit_arry[i].oper==')')//是右括号将运算符⼀直出栈,直到遇见左括号193 {194 oS_pointer--;//指向栈顶195 dS_pointer--;//指向栈顶196while(Ope_stack[oS_pointer] != '(' && oS_pointer != 0)197 {198 Dig_stack[dS_pointer-1] = Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 199 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈200201 dS_pointer--;//前⼀个操作数出栈202//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);203 }204 oS_pointer--;//左括号出栈205206 oS_pointer++;//恢复指向栈顶之上207 dS_pointer++;208 }209else if(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer-1]))//和栈顶元素⽐较210 {211 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;212//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);213 }214else//运算符出栈,再将该操作符⼊栈215 {216 oS_pointer--;//指向栈顶217 dS_pointer--;//指向栈顶218while(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer])==0 && oS_pointer != -1) 219 {//当前操作符⽐栈顶操作符优先级⾼220 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 221 Ope_stack[oS_pointer--]);222 dS_pointer--;223//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);224 }225 oS_pointer++;//恢复指向栈顶之上226 dS_pointer++;227 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;228 }229 }230 }231 }232 }233/*for(i=0;i<oS_pointer;i++)234 printf("操作符栈%oS_pointer\Ope_u_count",Operator[i]);235 for(i=0;i<dS_pointer;i++)236 printf("操作数栈%lf\n",Digit[i]);*/237 oS_pointer--;//指向栈顶元素238 dS_pointer--;//指向栈顶元素239while(oS_pointer != -1)240 {241 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 242 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈243 dS_pointer--;//前⼀个操作数出栈244//printf("操作数栈顶元素为%lf\Ope_u_count",Digit[dS_pointer]);245 }246//printf("%dS_pointer,%dS_pointer\n",oS_pointer,dS_pointer);247if(oS_pointer==-1 && dS_pointer==0)248 flag=1;//为1表⽰表达式合法249return Dig_stack[0];250 }251252int Ope_Compar(char ope1,char ope2)253 {//操作符运算优先级⽐较254char list[]={"(+-*/"};255int map[5][5]={//先⾏后列,⾏⽐列的运算级优先级低为0,⾼为1256// ( + - * /257/* ( */1,0,0,0,0,258/* + */1,0,0,0,0,259/* - */1,0,0,0,0,260/* * */1,1,1,0,0,261/* / */1,1,1,0,0 };262int i,j;263for(i=0;i<5;i++)264if(ope1==list[i]) break;265for(j=0;j<5;j++)266if(ope2==list[j]) break;267return map[i][j];268 }269270double Four_arithm(double x,double y,char oper)271 {//四则运算272switch(oper)//保证不含其它运算符273 {274case'+': return x+y;275case'-': return x-y;276case'*': return x*y;277case'/': return x/y;//y不能为0278default : return0;279 }280 }281282int Isoper(char ch)283 {//判断合法字符 + - * / ( ) =284if(ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='(' || ch==')' || ch=='=')285return1;286return0;287 }288289void Display()290 {//打印菜单291 system("cls");292 printf("/******************************************************************************/\n");293 printf("\t\t 欢迎使⽤本四则运算表达式求值系统\n");294 printf("\n\t说明:建议请您先阅读使⽤说明,再输⼊相应的数字进⾏操作,谢谢配合!\n"); 295 printf("\n\t\t1 四则运算表达式求值\n");296 printf("\n\t\t2 使⽤说明\n");297 printf("\n\t\t0 退出\n");298 printf("/******************************************************************************/\n");299 }300301void Instru()302 {//打印使⽤说明303 FILE *fp;304char ch;305if( ( fp=fopen("使⽤说明.txt","r") ) == NULL)306 {307 printf("⽂件打开失败!\n");308 exit(0);309 }310for(; (ch = fgetc(fp)) != EOF; )311 putchar(ch);312 fclose(fp);313 printf("\n");314 system("pause");315 }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct DNode //定义双链表结点类型
{
ElemType data;
struct DNode *prior; //指向前驱结点
struct DNode *next;
int ListEmpty(DLinkList *L) {
return(L->next==NULL); } int ListLength(DLinkList *L) { DLinkList *p=L;
int i=0; while(p->next!=NULL) {
i++; p=p->next; } return(i); } void DispList(DLinkList *L) { DLinkList *p=L->next; while(p!=NULL) { printf("%c",p->data); p=p->next; } printf("\n"); }
return 0;
}
else
{
for(j=L->length;j>=i;j--)/*将第 i 个位置以后的元素依次后移*/
L->list[j]=L->list[j-1];
L->list[i-1]=e;
/*插入元素到第 i 个位置*/
L->length=L->length+1;
/*将顺序表长增 1*/
/*查找线性表中元素值为 e 的元素,查找成功将对应元素的序号返回,否则返回 0 表示失败。
*/
{
ListNode *p;
int i;
if(ListEmpty(head)) /*在查找第 i 个元素之前,判断链表是否为空*/
return 0;
p=head->next; /*指针 p 指向第一个结点*/
int LocateElem(DLinkList *L,ElemType e) {
int i=1; DLinkList *p=L->next; while(p!=NULL&&p->data!=e) { p=p->next;
i++; } if(p==NULL)
return(0); else
return(i); }
return 1;
}
}
⑶ 顺序表删除
int DeleteList(SeqList *L,int i,DataType *e) {
int j; if(L->length<=0) {
printf("顺序表已空不能进行删除!\n"); return 0; } else if(i<1||i>L->length) { printf("删除位置不合适!\n"); return -1; } else { *e=L->list[i-1]; for(j=i;j<=L->length-1;j++)
3、部分参考实验代码:
⑴ 顺序表结构的定义: #include <stdio.h> #define ListSize 100 typedef int DataType; typedef struct {
DataType list[ListSize]; int length; }SeqList;
⑵ 顺序表插入(在第 i 号元素前插入一个新的元素) int InsertList(SeqList *L,int i,DataType e) /*在顺序表的第 i 个位置插入元素 e,插入成功返回 1,如果插入位置不合 法返回-1,顺序表满返回 0*/ {
3、部分参考实验代码:
1、结点定义
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}ListNode,*LinkList;
2、单链表初始化
void InitList(LinkList *head)
/*将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置为空。*/
2、实现内容
1、单链表基本操作的实现 2、链表应用的实例(二选一) a) 利用链表的基本运行,实现如果在链表 A 中出现的元素,在链表 B 中也出现, 则在链表 A 中将该元素删除。 b)、约瑟夫(Josephus)问题的求解(循环链表的使用,使用 C 和 C++语言均可)。 假设有编号为 1,2,……,n 的 n 个人围坐成一圈,约定从编号为 k(n>=k>=1) 的人开始报数,数到 m 的那个人出列,他的下一个人从 1 开始重新报数,数到 m 的那个人出列,依次类推,直到所有的人全部出列为止,由此产生一个出队编号 的序列。 1、给定一个 8 个人的圈(n=8),约定从第 3 个人开始报数(k=3),数到第 4 个人时的那个人出列(m=4),使用循环链表,产生一个出队编号的序列。 2、参考的出队序列为:< 6 2 7 4 3 5 1 8 >。
i=1;
while(p)
{
if(p->data==e)/*找到与 e 相等的元素,返回该序号*/
return i;
else
{
p=p->next;
i++;
}
}
if(!p)
/*如果没有找到与 e 相等的元素,返回 0,表示失败*/
return 0;
}
int InsertList(LinkList head,int i,DataType e)
/*在单链表中第 i 个位置插入一个结点,结点的元素值为 e。插入成功返回 1,失败返回 0*/
{
自己完成
}
int DeleteList(LinkList head,int i,DataType *e)
/*删除单链表中的第 i 个位置的结点。删除成功返回 1,失败返回 0*/
{
ListNode *pre,*p;
return 0;
}
/*指针 p 指向单链表中的第 i 个结点,并将该结点的数据域值赋值给 e*/
p=pre->next;
*e=p->data;
/*将前驱结点的指针域指向要删除结点的下一个结点,也就是将 p 指向的结点与单链表
断开*/
pre->next=p->next;
free(p);
/*释放 p 指向的结点*/
return 1;
}
实验三 双链表的操作
1、目的
理解双链表的基本操作 了解双链表的建立和输出 掌握双链表的插入、删除等实现方法
2、内容和要求 基本要求
编写一个程序,实现双链表的各种基本运算(假设双链表的元素类型为
char),并在此基础上设计一个程序,完成如下功能: (1)初始化双链表 h; (2)采用尾插法依次插入元素 a,b,c,d,e; (3)输出双链表 h; (4)输出双链表 h 长度; (5)判断双链表 h 是否为空; (6)输出双链表 h 的第 3 个元素; (7)输出元素 a 的位置; (8)在第 4 个位置上插入元素 f; (9)输出双链表 h; (10)删除 h 的第 3 个元素; (11)输出双链表 h; (12)释放双链表 h。
ListNode *p;
int j;
if(ListEmpty(head)) /*在查找第 i 个元素之前,判断链表是否为空*/
return NULL;
if(i<1)
/*在查找第 i 个元素之前,判断该序号是否合法*/
return NULL;
j=0;
p=head;
while(p->next!=NULL&&j<i)
表示失败。*/
{
ListNode *p;
p=head->next; /*指针 p 指向第一个结点*/
while(p)
{
if(p->data!=e) /*找到与 e 相等的元素,返回该序号*/
p=p->next;
else
break;
}
return p;
}
int LocatePos(LinkList head,DataType e)
{
if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL) /*为头结点分配一个存储空间*/
exit(-1);
(*head)->next=NULL;
/*将单链表的头结点指针域置为空*/
}
ListNode *Get(LinkList head,int i) /*查找单链表中第 i 个结点。查找成功返回该结点的指针表示成功;否则返回 NULL 表示失 败。*/ {
//指向后继结点
} DLinkList;
void InitList(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList));
L->prior=L->next=NULL;
}
void DestroyList(DLinkList *&L)
{
DLinkList *p=L, *q=p->next; while(q!=NULL) { free(p); p=q; q=q->next; } free(p); }
int GetElem(DLinkList *L,int i,ElemType &e) { int j=0;
相关文档
最新文档