当前位置:文档之家› 《数据结构》实验报告 设计循环单链表

《数据结构》实验报告 设计循环单链表

《数据结构》实验报告
1、实验名称:设计循环单链表
2、实验日期: 2013-3-26
3、基本要求:
1)循环单链表的操作,包括初始化、求数据元素个数、插入、删除、取数据元素;
2)设计一个测试主函数实际运行验证所设计循环单链表的正确性。

4、测试数据:
依次输入1,2,3,4,5,6,7,8,9,10,删除5,再依次输出数据元素。

5、算法思想或算法步骤:
主函数主要是在带头结点的循环单链表中删除第i个结点,其主要思想是在循环单链表中寻找到第i-1个结点并由指针p指示,然后让指针s指向a[i]结点,并把数据元素a[i]的值赋给x,最后把a[i]结点脱链,并动态释放a[i]结点的存储空间。

6、模块划分:
1)头文件LinList.h。

头文件LinList.h中包括:结点结构体定义、初始化操作、求当前数据个数、插入一个结点操作、删除一个结点操作以及取一个数据元素操作;
2)实现文件dlb.cpp。

包含主函数void main(void),其功能是测试所设计的循环单链表的正确性。

7、数据结构:
链表中的结点的结构体定义如下:
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;
8、源程序:
源程序存放在两个文件中,即头文件LinList.h和实现文件dlb.cpp。

//头文件LinList.h
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;
void ListInitiate(SLNode **head) //初始化
{
*head=(SLNode *)malloc(sizeof(SLNode));
//申请头结点,由head指示其地址
(*head)->next=*head;
}
int ListLength(SLNode *head)
{
SLNode *p=head; //p指向头指针
int size=0; //size初始值为0
while(p->next!=head) //循环计数
{
p=p->next;
size++;
}
return size;
}
int ListInsert(SLNode *head,int i,DataType x)
//在带头结点的循环单链表head的第i(0<=i<=size)个结点前插//入一个存放数据元素x的结点。

插入成功返回1;失败则返回0 {
SLNode *p,*q;
int j;
p=head;
j=-1;
while(p->next!=head&&j<i-1)
//最终让指针p指向第i-1个结点
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置参数错!");
return 0;
}
q=(SLNode *)malloc(sizeof(SLNode)); //生成新结点
q->data=x; //新结点数据域赋值
q->next=p->next;
p->next=q;
return 1;
}
int ListDelete(SLNode *head,int i,DataType *x)
//删除带头结点循环单链表head的第i(0<=i<=size-1)个结点被删//除结点的数据域值由x带回。

删除成功则返回1;失败则返回0。

{
SLNode *p,*s;
int j;
p=head;
j=-1;
while(p->next!=head&&p->next->next!=NULL&&j<i-1)
//循环结束时指针p指向第i-1个结点
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("删除位置参数错!");
return 0;
}
s=p->next; //指针s指向a[i]结点
*x=s->data; //把指针s所指结点的数据域值赋予x p->next=p->next->next; //删除
free(s); //释放指针s所指结点的内存空间return 1;
}
int ListGet(SLNode *head,int i,DataType *x)
{
SLNode *p;
int j;
p=head;
j=-1;
while(p->next!=head&&j<i)
{
p=p->next;
j++;
}
if(j!=i)
{
printf("取元素位置参数错!");
return 0;
}
*x=p->data;
return 1;
}
//实现文件dlb.cpp
#include<stdio.h> //包含printf()函数#include<malloc.h> //包含malloc()函数typedef int DataType; //定义DataTyoe为int #include"LinList.h" //包含LinList.h头文件void main(void)
{
SLNode *head; //定义头指针变量
int i,x;
ListInitiate(&head); //初始化
for(i=0;i<10;i++) //插入10个数据元素
ListInsert(head,i,i+1); //删除数据元素5
ListDelete(head,4,&x);
for(i=0;i<ListLength(head);i++) //显示当前数据元素
{
ListGet(head,i,&x); //取元素
printf("%d ",x); //显示
}
}
9、测试情况:
1)程序运行输出为:
1 2 3 4 6 7 8 9 10
2)测试结果分析:
程序运行结果和预测的完全相同,说明所设计的循环单链表是正确的。

相关主题