西南交大赵宏宇数据结构实验报告线性表
数据结构线性表实验报告

实验报告实验一线性表实验目的:1. 理解线性表的逻辑结构特性;2. 熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;3. 熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;4•掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。
实验原理:线性表顺序存储结构下的基本算法;线性表链式存储结构下的基本算法;实验内容:2 - 21设计单循环链表,要求:(1 ) 单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。
(2 ) 设计一个测试主函数,实际运行验证所设计单循环链表的正确性。
2 — 22 .设计一个有序顺序表,要求:(1 ) 有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。
有序顺序表与顺序表的主要区别是:有序顺序表中的数据元素按数据元素值非递减有序。
(2 ) 设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。
(3) 设计合并函数ListMerge ( L1,L2,L3 ),功能是把有序顺序表 L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。
并设计一个主函数,验证该合并函数的正确性。
程序代码:2-21 (1)头文件 LinList.h 如下:typedef struct node{DataType data;struct node *next;}SLNode;/* ( 1 )初始化 ListInitiate(SLNode * * head)*/void ListInitiate(SLNode * * head){ /* 如果有内存空间,申请头结点空间并使头指针 head 指向头结点 */if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);(*head)->next=NULL; /* 置结束标记 NULL*/}/*(2) 求当前数据元素个数 ListLength(SLNode * head)*/int ListLength(SLNode * head){SLNode *p=head;int size=0;while(p->next!=head){p=p->next;size++;}return size;}/*(3) 插入 ListInsert(SLNode * head , int i , DataType x)*//* 在带头结点的单链表的第 i(0<=i<=size) 个结点前 *//* 插入一个存放数据元素 x 的结点。
《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现

《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
数据结构线性表实验报告

《数据结构》实验报告专业:学号:姓名:实验二线性表【实验目的】1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。
2.通过编程、上机调试,进一步理解线性表的基本概念,东运用C语言实现线性表基本操作。
3.熟练掌握线性表的综合应用问题。
【实验内容】1、一个线性表有n个元素(n-MAXSIZE.MAXSIZE指线性表的最大长度),且递增有。
现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。
设计程序实现。
要求:采用顺序存储表示实现;采用链式存储表示方法实现:比较两种方法的优劣。
2.从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。
要求:①指定的值x由键盘输入;②程序能处理空链表的情况。
3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。
要求:①该算法用函数(非主函数)实现;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
LinkedList Exchange(LinkedList HEAD,p)//HEAD是单链表头结点的指针,p是链表中的一个结点。
本算法将p所指结点与其后继结点交换。
(q=head->next;//q是工作指针,指向链表中当前待处理结点。
pre=head;//pre是前驱结点指针,指向q的前驱。
while(q'=null &&q1=p)(pre=q;q=q->next;]/未到p结点,后移指针。
if(p->next==null)printf(“p无后继结点\n”);/p是链表中最后一个结点,无后继。
else/处理p和后继结点交换(q=p->next;//暂存p的后继。
pre->next=q://p前驱结点的后继指向p的后继。
p->next=q->next;//p的后继指向原p后继的后继。
q->next=p://原p后继的后继指针指向p。
《数据结构》线性结构实验报告

《数据结构》线性结构实验报告2、源程序:#include <stdio.h>#include<stdlib.h>#define MAXSIZE 1024typedef int elemtype;typedef struct SequenStack{elemtype data[MAXSIZE];int top;}SequenStack;SequenStack * Init_SequenStack(){SequenStack * S;S = (SequenStack *)malloc(sizeof(SequenStack));if (S == NULL)return S;S->top = -1;return S;}int SequenStack_Empty(SequenStack * S)//判栈空{if (S->top == -1){return 1;}{int a;printf("请以十进制输入一个数:\n");scanf_s("%d", &a);printf("转化为二进制为:");Conversion(a);printf("\n");}运行结果:3、源程序:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{char data;struct node* next;}LinkStack;//初始化LinkStack* Init_LinkStack(){LinkStack* top;top = (LinkStack*)malloc(sizeof(LinkStack));top->next = NULL;return top;}//入栈void Push_LinkStack(LinkStack* top, char x){LinkStack* node;node = (LinkStack*)malloc(sizeof(LinkStack));node->data = x;node->next = top->next;top->next = node;}运行结果:4、源程序:#include <stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 20typedef int elemtype;typedef struct QueueNode{elemtype data;struct QueueNode* next;}LinkedQueueNode;typedef struct LQueue{LinkedQueueNode* front;LinkedQueueNode* rear;}LQueue, *LinkedQueue;typedef struct Person{char name[MAXSIZE];char sex;}Person;typedef char* ElemType;//链队初始化LinkedQueue Init_LinkedQueue(){LinkedQueue Q = (LinkedQueue)malloc(sizeof(LQueue));LinkedQueueNode * head = (LinkedQueueNode *)malloc(sizeof(LinkedQueueNode));if (head != NULL && Q != NULL){head->next = NULL;Q->front = head;Q->rear = head;printf("输入参与者的姓名,性别\n");for (i = 0; i < num; i++){printf("输入第%d个舞者的名字:\n", i + 1);scanf_s("%s", &dancer[i].name, 10);printf("输入第%d个人的性别(F/M):\n", i + 1);scanf_s("%s", &dancer[i].sex, 10);while (dancer[i].sex != 'F' && dancer[i].sex != 'M'){printf("输入错误,请重新输入第%d个人的性别(F/M):\n", i + 1);scanf_s("%s", &dancer[i].sex, 10);}}DancePartner(dancer, num);break;case 0:printf("感谢你的使用!\n");break;default:printf("无此选项!\n");break;}} while (n != 0);return 0;}运行结果:。
数据结构实验报告1线性表的顺序存储结构

数据结构实验报告1线性表的顺序存储结构数据结构实验报告1线性表的顺序存储结构第一章引言线性表是计算机中最常见的数据结构之一,它是一种有序的数据元素集合,其中的数据元素之间具有一对一的关系。
线性表的存储结构有多种方式,其中顺序存储结构是最简单的一种,它使用一段连续的存储单元来存储线性表中的元素。
第二章顺序存储结构的定义顺序存储结构是将线性表中的元素按照其逻辑顺序依次存储在一块连续的存储空间中。
顺序存储结构的特点是可以快速地访问任意位置的元素,但插入和删除操作需要移动大量的元素。
第三章顺序存储结构的实现1.存储空间的分配顺序存储结构通常使用数组来实现,数组的长度应该大于等于线性表的长度,以防止溢出。
存储空间的分配可以使用静态分配或动态分配两种方式来实现。
2.线性表的初始化初始化线性表时,需要设置线性表的长度和当前元素的个数。
3.线性表的增删改查操作●插入操作:________在指定位置插入一个元素时,需要将插入位置之后的元素依次后移,给待插入的元素腾出位置。
●删除操作:________删除指定位置的元素时,需要将删除位置之后的元素依次前移,覆盖删除位置上的元素。
●修改操作:________修改指定位置的元素时,直接对该位置上的元素进行修改即可。
●查找操作:________根据指定的元素值,查找其在顺序存储结构中的位置。
4.线性表的遍历操作遍历操作可以按照顺序访问线性表中的每个元素,可以使用循环结构实现遍历操作。
第四章顺序存储结构的优缺点分析1.优点:________可以快速地访问任意位置的元素,节省存储空间。
2.缺点:________插入和删除操作需要移动大量的元素,不适用于频繁插入和删除的场景。
第五章实验过程和结果分析在本次实验中,我们以顺序存储结构为基础,实现了线性表的增删改查操作,并进行了遍历操作。
通过实验,我们发现顺序存储结构在查询操作上有较好的性能,但在插入和删除操作上的性能较差。
第六章附件本文档涉及的附件详见附件文件。
数据结构实验报告-线性表的顺序存储

姓 名
专业班级
实验地点
指导教师
实验时间
一、实验目的及要求
本次实验目的是通过上机练习,熟悉和掌握课堂所讲授的基本知识点。要求上机以前要认真复习课堂教学内容。完成教师带领实验,完成线性表的顺序存储实验。
二、实验设备(环境)及要求
计算机;学生不许把食物带到机房吃;不许上网做与实验无关的内容;不许同学之间聊天;保持实验室安静卫生。下课把键盘,座椅放回原处。
Integer length;/*当前线性表长度,线性表中现有元素个数*/
Integer listsize;/*当前分配的存储量以下定义线性表的操作*/
Integer InitList(Class_List *SqList)
/*构造一个空的线性表*/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Integer;
typedef char *String;
typedef struct
{
Integer number;
String name[10];
Integer age;
String interest[50];
完成一个有多于3个学生的线性表。并且显示学生信息。删除其中一个学生。然后再打印显示。
Source.cpp
#include"header.h"
void main()
{
Class_List xinji2013;
InitList(&xinji2013);
Student st;
Integer i,n=2,w,q,e;
三、实验内容与步骤
数据结构《线性表的应用》实验报告

实验报告——线性表应用一、实验目的用单链表储存一元多项式,并实现两个多项式的相加运算。
二、实验内容1.先创建链表,存储多项式;2.输出多项式;3.两个多项式相加;4.输出多项式。
三、程序代码#include <stdio.h>#include <stdlib.h>#include <math.h>//一元多项式链式储存的节点结构typedef struct Polynode{float coef;int exp;struct Polynode * next;} Polynode , * Polylist;//建立一元多项式的链表Polylist polycreate(){Polynode * head,* rear,* s;float c;int e;head=(Polynode* )malloc(sizeof(Polynode));rear=head;scanf("%f,%d",&c,&e);while(c!=0){s=(Polynode * )malloc(sizeof(Polynode));s->coef=c;s->exp=e;rear->next=s;rear=s;scanf("%f,%d",&c,&e);}rear->next=NULL;return(head);}//输出多项式void print(Polynode*L){Polynode*p;p=L->next;printf("a=");if(p&&p->coef!=0)printf("%.2f*x^%d",p->coef,p->exp);while(p->next!=NULL){if((p->next->coef)>0&&p)printf("+");elseprintf("-");p=p->next;printf("%.2f*x^%d",fabs(p->coef),p->exp);}}//多项式相加void polyadd(Polylist polya,Polylist polyb){Polynode*p,*q,*tail,*temp;int sum;p=polya->next;q=polyb->next;tail=polya;while (p!=NULL&&q!=NULL){if(p->exp<q->exp){tail ->next=p; tail=p;p=p->next;}else if (p->exp==q->exp);{sum=p->coef+q->coef;if(sum!=0){p->coef=sum;tail->next=p;tail=p;p=p->next;temp=q;q=q->next;free(temp);}else{temp=p;p=p->next;free(temp);temp=q;q=q->next;free(temp);}}{tail ->next=q;tail=q;q=q->next;}}if(p!=NULL)tail->next=p;elsetail->next=q;}void main(){Polynode*a,*b;printf("输入a的系数和指数:\n");a = polycreate();print(a);printf("\n");printf("输入b的系数和指数:\n");b = polycreate();print(b);printf("\n");polyadd(a,b);printf("两个多项式的和为:\n");print(a);}四、实验结果五、实验过程中遇到的问题及处理方法程序运行时,在中文状态下输入“,”回车后就不能再输入了,应在英文状态下输入“,”。
数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作 前言 计算机编程中加工处理的对象是数据,而数据具有一定的组织结 构,所以学习计算机编程仅仅了解计算机语言是不够的,还必须掌握 数据的组织、存储和运算的一般方法,这便是数据结构课程中所研究 的内容,也是我们编写计算机程序的重要基础,由于它对计算机学科 起到承前启后的作用,因此本课程被列为计算机等相关专业最重要的 专业基础课;同时数据结构是计算机专业教学的一门核心课程。计算 机各领域都要用到各种数据结构,而且要从事计算机科学与技术工 作,尤其是计算机领域的软件开发工作,必须具备较强的数据结构基 础。 数据结构课程内容丰富、学习量大,实践性强;隐含在各部分内 容中的方法和技术多;算法设计具有动态性和抽象性等特点,看懂听 明白与掌握会应用之间有相当大的一段距离。所以学生必须多实践才 能进一步加深对课程的理解,理解和掌握算法设计所需的方法和技 术,为整个专业学习打下良好的基础。 2 1) 2) 1) 2) 实验一 线性表的基本操作及其应用 1、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现。 3 4、掌握顺序表的存储结构形式及其描述和基本运算的实现。 5、熟练掌握动态链表结构及有关算法的设计 题目一:顺序表的基本操作 实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的基本操作。 [基本要求] (1)依次从键盘读入数据,建立带头结点的顺序表; (2)输出顺序表中的数据元素 (3)求顺序表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。 (6)根据算法,将两个有序的顺序表合并成一个有序顺序表。 由学生任意指定。 题目二:单链表的基本操作 实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等 单链表的基本操作。 (1)依次从键盘读入数据,建立带头结点的单链表; (2)输出单链表中的数据元素 (3)求单链表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。 (6)根据算法,将两个有序的单链表合并成一个有序单链表。 由学生任意指定。 #include using namespace std; #define TRUE 1 4 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { //结构体 ElemType *elem; int length; int listsize; }SqList; SqList Lx; Status InitList_Sq(SqList &L) //分配空间 { L.elem=new ElemType[LIST_INIT_SIZE]; if(!L.elem)exit(OVERFLOW); L.length =0; L.listsize=LIST_INIT_SIZE; return OK; } Status ListInsert(SqList &L,int i,ElemType e) //插入新元素 { int *q,*p;ElemType *newbase; if(i<1 || i>L.length+1) return ERROR; if(L.length>=L.listsize) { newbase=new ElemType[L.listsize+LISTINCREMENT]; if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; } q=&(L.elem[i-1]); for (p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p; 5 *q=e; ++L.length; return OK; } Status Listlength(SqList L) //长度 { int *p=L.elem; //判断线形表是否存在 while(p) { return (L.length); } } Status GetElem(SqList L, int i,ElemType &e) //取元素 { if(i<1 || i>L.length) return ERROR; else { e=L.elem[i-1]; return e; } } void MergeList(SqList La,SqList Lb,SqList &Lc) //合并 { ElemType ai,bj; InitList_Sq(Lc); int i=1,j=1,k=0; int La_len,Lb_len; La_len=Listlength(La); Lb_len=Listlength(Lb); while((i<=La_len)&&(j<=Lb_len)) { GetElem(La,i,ai);GetElem(Lb,j,bj); if(ai<=bj) { ListInsert(Lc,++k,ai);++i; } else { ListInsert(Lc,++k,bj);++j; } } while(i<=La_len) { GetElem(La,i++,ai); 6 ListInsert(Lc,++k,ai); } while(j<=Lb_len) { GetElem(Lb,j++,bj); ListInsert(Lc,++k,bj); } } void show(SqList L,int i) //显示 { int j;ElemType k; cout<<"顺序表显示如下:"
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告知识范畴:线性表完成日期:2016年03月17日实验题目:两个有序线性表的归并算法实验内容及要求:从键盘输入数据,建立两个有序线性表(每个线性表的输入数据按由小到大次序输入来建立线性表,不必考虑排序算法);输出建好的这两个有序线性表;将这两个有序线性表归并为一个有序线性表;输出归并后的有序线性表。
从键盘实现数据输入与输出的格式自拟;要求完成两个同样功能的程序,一个程序采用顺序存储结构,另一个程序采用链表实现线性表的存储。
其中链表实现时,要求利用两个升序链表的结点实现归并,即归并时不能新建结点,归并后原来两个升序链表的存储空间不在存在。
实验目的:掌握两个有序线性表的归并算法。
数据结构设计简要描述:顺序存储结构使用结构体,结构体中带有数组以及数组的最大存储空间。
链式存储结构同样使用结构体定义结点,用带附加头结点单向链表,每个结点包括整型或浮型类型的数据域和一个指针域。
算法设计简要描述:顺序与链式两种存储均为依次互相比较两线性表中值的大小。
顺序存储是新申请存储空间将数据依次存入静态数组中,链式存储是利用原有空间将结点按照数据大小进行重新连接。
输入/输出设计简要描述:从键盘以从小到大的顺序输入以空格(或CR或TAB)分隔的若干不等于0的整数,直到输入0时停止输入,按整数输入次序建立结点并顺序连接结点。
编程语言说明:使用Visual C++和C编程。
顺序表结构部分采用C语言实现;各函数使用的是C语言的编写规范,输出与输入使用的是printf和scanf;链式表结构部分使用的是C++语言;输入和输出分别采用cin和cout;注释采用C/C++规范。
主要函数说明:LinkList crt()//创建链表void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)//归并算法排序void prt(LinkList h)//输出存储的元素程序测试简要报告:测试1:测试2:源程序代码:1.顺序存储:#include "stdafx.h"#include <stdio.h>#define MAX_N 10typedef struct{int elem[MAX_N];int n;int maxsize;}SqList;void initiate(SqList *pL){int a;pL->n=0;pL->maxsize=MAX_N;while(1){scanf("%d",&a);if(a==0||pL->n>=MAX_N)break; pL->elem[pL->n++]=a;}}int merge(SqList *a,SqList *b,SqList *c){if(a->n+b->n>c->n)return -1;int i=0;int j=0;int k=0;c->n=a->n+b->n;while(i<a->n&&j<b->n){if((a->elem[i]<b->elem[j]))c->elem[k++]=a->elem[i++]; else c->elem[k++]=b->elem[j++];}while(i<a->n) c->elem[k++]=a->elem[i++]; while(j<b->n) c->elem[k++]=b->elem[j++]; return 0;}void output(SqList *pL){for(int i=0;i<pL->n;i++){printf("%3d",pL->elem[i]);}printf("\n");}int main(){SqList a,b,c;initiate(&a);initiate(&b);c.n=MAX_N;merge(&a,&b,&c);output(&c);return 0;}2.链表:#include <stdio.h>#include <malloc.h>typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode, *LinkList;#define CreateNode(p) p=(LinkList)malloc(sizeof(LNode)) #define DeleteNode(p) free((void*)(p))LinkList crt(){LinkList p,last,h;CreateNode(h);last=h;int e;while(1){scanf("%d",&e);if(e==0)break;CreateNode(p);p->data=e;last->next=p;last=p;}last->next=NULL;return h;}void prt(LinkList h){LinkList p;CreateNode(p);p=h->next;printf("%d ",p->data);p=p->next;}DeleteNode(p);}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pb,pc,p;CreateNode(p);CreateNode(pa);CreateNode(pb);CreateNode(pc);pa = La->next;pb = Lb->next;Lc = pc;while(pa && pb){if((pa->data) <= (pb->data)){p=pa;.pa=pa->next;pc->next=p;pc=p;}else{p=pb;pb=pb->next;pc->next=p;pc=p;}}if(pa)pc->next=pa;if(pb)pc->next=pb;}{LinkList La,Lb,Lc;La = crt();prt(La);Lb = crt();prt(Lb);printf("\nGet:");MergeList(La,Lb,Lc);prt(Lc);return 0;}附加题:实验题目:双向循环链表中满足条件的结点的删除实验内容及要求:已知双向循环链表(不带附加头结点)某结点地址p。
编写算法,删除链表中结点data域值满足条件beErased的所有结点。
若执行删除操作后链表中无剩余结点,函数返回NULL;否则,函数返回某剩余结点地址。
实验目的:掌握双向循环链表的使用数据结构设计简要描述:双向循环链表使用结构体定义其中结点,每个结点中包含一个整型数据,两个结点指针域,一个前趋指针,一个后继指针。
算法设计简要描述:双向循环链表中删除结点同单向链表中算法类似。
输入/输出设计简要描述:从键盘输入以空格(或CR或TAB)分隔的若干不等于0的整数,直到输入0时停止输入,建立结点并连接结点。
输出各结点的整数值时,每个整数采用3列字符域宽。
输入与输出有文字提示。
编程语言说明:使用Visual C++编程。
主要代码采用C语言实现;动态存储分配采用C的malloc和free 操作符实现;输入与输出采用C的scanf和printf流。
主要函数说明:bool beErased(int d) //满足此条件的结点删除void initiate(Node *p0) //输入若干非0整数,建立双向循环链表Node* del(Node *p)//删除满足条件的结点void print(Node *p) //输出链表中的数据void release(Node *p) //释放申请的结点空间(1)测试实例1程序输入请输入一串整数(以0为结尾):1 3 4 5 7 9 0程序输出删除满足条件的数据后,所剩数据为: 1 7 9结论程序输出结果与期望输出结果相符。
源程序代码://双向循环链表删除某结点#include "stdafx.h"#include <stdio.h>#include <malloc.h>#define CreateNode(p) p=(Node *)malloc(sizeof(Node)) #define DeleteNode(p) free((void *)p)bool beErased(int d){if(d>=2&&d<=5) return true;else return false;}typedef struct node{int data;struct node *next;struct node *pre;}Node;void initiate(Node *p0){int d;scanf("%d",&d);Node *p,*temp;p0->data = d;p0->next=p0;p0->pre=p0;temp = p0;while(1){scanf("%d",&d);if(d==0) break;CreateNode(p);p->data = d;p0->pre = p;p->pre = temp;temp->next = p;temp = p;}}Node* del(Node *p){Node *q,*s;q=p->next;while(q!=p){if(beErased(q->data)){s=q; q=q->next;s->pre->next = q;q->pre = s->pre;DeleteNode(s);}else q=q->next;}if(beErased(p->data)){if(p->next==p){ DeleteNode(p);printf("此链表已空\n"); return NULL;} s=p; p=p->next;s->pre->next = p;p->pre = s->pre;DeleteNode(s);}return p;}int print(Node *p){Node *s=p->next;printf("删除满足条件的数据后,所剩数据为:");printf("%3d",p->data);while(s!=p){printf("%3d",s->data);s = s->next;}return 0;}void release(Node *p){Node *temp;while(s!=p){temp = s;s = s->next;DeleteNode(temp);}DeleteNode(p);}int main(int argc, char* argv[]){Node *l;CreateNode(l);printf("请输入一串整数(以0为结尾):");initiate(l);l = del(l);if(l!=NULL){print(l); release(l);}printf("\n");return 0;}。