《数据结构》课程实验报告
专业:
指导老师:
班级:
姓名:
学号:
完成日期:
一、 实验目的
1、 掌握线性表的顺序存储结构和链式存储结构;
2、 熟练掌握顺序表和链表基本算法的实现;
3、 掌握利用线性表数据结构解决实际问题的方法和基本技巧;
4、 按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果);
5、 按时提交实验报告。
二、实验环境
计算机、C语言程序设计环境
三、实验学时
2学时,选做实验。
四、实验内容
一、顺序表的基本操作实现实验
要求:数据元素类型ElemType取整型int。按照顺序存储结构实现如下算法(各算法边界条件和返回结果适当给出):
① 创建任意整数线性表(即线性表的元素值随机在键盘上输入),长度限定在20之内;
② 打印(遍历)该线性表(依次打印出表中元素值);
③ 在线性表中查找第i个元素,并返回其值;
④ 在线性表中第i个元素之前插入一已知元素;
⑤ 在线性表中删除第i个元素;
⑥ 求线性表中所有元素值(整数)之和;
二、链表(带头结点)基本操作实验
要求:数据元素类型ElemType取字符型char。按照动态单循环链表结构实现如下算法(各算法边界条件适当给出):
① 创建任意字符型有序(递增排序)单循环链表(即链表的字符元素随机在键盘上输入),长度限定在15之内;
② 打印(遍历)该链表(依次打印出表中元素值);
③ 在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
④ 在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
⑤ 在链表中按照有序方式插入一已知字符元素;
⑥ 在线性表中删除第i个结点;
⑦ 计算链表的长度。
五、实验内容一步骤:
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef int ElemType;
typedef struct
{
ElemType elem[MAX];
int last;
}SeqList;
void InitList(SeqList *L)
{
L->last=-1;
}
void PrintList(SeqList *L)
{
int i;
printf("\n现在的数据为:");
for(i=0;i<=L->last;i++)
printf("%d ",L->elem[i]);
}
void CreatList(SeqList *L)
{
ElemType e;
int i=0;
printf("\n输入数据(-1退出):");
scanf("%d",&e);
while(e!=-1)
{
if(i<MAX)
{
L->elem[i]=e;
L->last=i;
i++;
}
else
{
printf("\n表满!");
}
scanf("%d",&e);
}
}
void Locate(SeqList *L, int i,ElemType e)
{
i=0;
while ((i<=L->last)&&(L->elem[i]!=e))
i++;
if (i<=L->last)
printf("\n%d在顺序表中第%d个位置上。",e,i+1);
else
printf("\n没有此数!");
}
void InsList(SeqList *L, int i, ElemType e)
{
int k;
if(i<1||i>L->last+2)
{
printf("\n插入位置i值不合法");
}
else if(L->last>=MAX-1)
printf("\n表已满无法插入");
else
{
for(k=L->last; k>=i-1; k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
L->last++;
}
PrintList(L);
}
void DelList(SeqList *L,int i,ElemType *e)
{
int k;
if(i<1||i>L->last+1)
{
printf("\n删除位置不合法!");
}
else
{
*e=L->elem[i-1];
for(k=i; k<=L->last; k++)
L->elem[k-1]=L->elem[k];
L->last=L->last-1;
}
PrintList(L);
}
void SumList(SeqList *L)
{
int j,sum=0;
for(j=0;j<=L->last;j++)
{
sum=sum+L->elem[j];
}
printf("所有元素之和:%d",sum);
}
void menu()
{
printf("\n************************菜单*********************");
printf("\n 1.创建任意整数线性表");
printf("\n 2.打印(遍历)线性表");
printf("\n 3.查找元素");
printf("\n 4.插入元素");
printf("\n 5.删除元素");
printf("\n 6.所有元素之和");
printf("\n 7.退出");
printf("\n***********************************************");
}
void main()
{
int i;
int flag=0;
ElemType e;
SeqList *L;
L=(SeqList*)malloc(sizeof(SeqList));
InitList(L);
menu();
while(!flag)
{
printf("\n\n请输入你的选择:");
scanf("%d",&i);
switch(i)
{
case 1:
CreatList(L);
break;
case 2:
PrintList(L);
break;
case 3:
printf("输入要查找的数值:");
scanf("%d",&e);
Locate(L,i,e);
break;
case 4:
printf("输入插入位置和数据值(a b):");
scanf("%d%d",&i,&e);
InsList(L,i,e);
break;
case 5:
printf("输入要删除元素的位置:");
scanf("%d",&i);
DelList(L,i,&e);
break;
case 6:
SumList(L);
break;
case 7:
flag=1;
break;
}
}
}
六、实验内容一测试数据与实验结果:
七、实验内容二步骤:
#include<stdio.h>
#include<malloc.h>
#define MAX 15
#define TURE 1
#define FALSE 0
typedef char ElemType;
typedef struct Node
{
char date;
struct Node * next;
}Node,*LinkList;
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(char));
(*L)->next=NULL;
}
void PrintfLink(LinkList L)
{
LinkList p;
p=L->next;
printf("链表为:");
while(p!=NULL)
{
printf("%c ",p->date);
p=p->next;
}
}
void Create(LinkList L)
{
LinkList s,r;
char c;
int flag=1;
int n;
r=L;
printf("元素个数:");
scanf("%d",&n);
if(n>MAX)
printf("超出限定长度!");
else
{
printf("输入字符(以#键结束):");
while(flag)
{
scanf("%c",&c);
if(c!='#')
{
s=(Node*)malloc(sizeof(char));
s->date=c;
r->next=s;
r=s;
}
else
flag=0;
r->next =NULL;
}
}
}
void Order(LinkList L)
{
char c;
Node *r,*q,*p;
for(r=L->next;r->next!=NULL;r=r->next )
{
p=r;
for(q=r->next;q;q=q->next )
if((q->date)<(p->date))
p=q;
if(p!=r)
{
c=r->date;
r->date=p->date;
p->date=c;
}
} PrintfLink(L);
}
void Get(LinkList L, int i, ElemType *e)
{
int j; Node *p;
p=L; j=-1;
while ((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
*e=p->date ;
if(i==j)
printf("第%d个元素为:%c",i,*e);
else
printf("FALSE");
}
void Locate(LinkList L, ElemType e)
{
int i=1;
LinkList p;
p=L->next ;
while(p&&p->date!=e)
{
i=i++;
p=p->next;
}
if(!p)
printf("FALSE\n");
else
{
printf("TRUE\n");
printf("该元素在第%d个位置!",i-1);
}
}
void InsList(LinkList L,int i,ElemType e)
{
Node *p,*s;
int k=0;
p=L;
while(p!=NULL&&k<i-1)
{
p=p->next;
k=k++;
}
if(!p)
{
printf("插入位置不合理!");
}
s=(Node*)malloc(sizeof(char));
s->date=e;
s->next=p->next;
p->next=s;
Order(L);
}
void DelList(LinkList L,int i,ElemType *e)
{
Node *p,*r;
int j;
j=0;
p=L;
while((p->next!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}
if(p->next!=NULL)
{
p->next=p->next->next;
r=p->next;
*e=r->date ;
printf("删除第%d个元素:%c\n",i,*e);
}
else
printf("删除结点的位置i不合理!");
}
void ListLength(LinkList L)
{
Node *p;int j=0;
p=L->next;
while(p!=NULL)
{
p=p->next;
j++;
}
printf("单链表的长度:%d",j);
}
void menu()
{
printf("\n************************菜单*********************");
printf("\n 1.创建任意字符型单循环链表");
printf("\n 2.打印(遍历)该链表");
printf("\n 3.查找第i个元素");
printf("\n 4.查找与一已知字符相同的元素");
printf("\n 5.插入元素");
printf("\n 6.删除第i个结点");
printf("\n 7.计算链表的长度");
printf("\n 8.退出");
printf("\n***********************************************");
}
void main()
{
int i;
int flag=0;
ElemType e;
LinkList L;
L=(LinkList)malloc(sizeof(char));
InitList(&L);
menu();
while(!flag)
{
printf("\n\n请输入你的选择(1~8):");
scanf("%d",&i);
switch(i)
{
case 1:
Create(L);
break;
case 2:
Order(L);
break;
case 3:
printf("输入要查找的第i个元素:");
scanf("%d",&i);
Get(L,i,&e);
break;
case 4:
printf("输入查找的元素:");
rewind(stdin);
scanf("%c",&e);
Locate(L,e);
break;
case 5:
printf("输入插入的元素:");
rewind(stdin);
scanf("%c",&e);
InsList(L,i,e);
break;
case 6:
printf("输入要删除第几个结点:");
scanf("%d",&i);
DelList(L,i,&e);
break;
case 7:
ListLength(L);
break;
case 8:
flag=1;
break;
}
}
}
八、实验内容二测试数据与实验结果: