数据结构
上机实验1
班级:计科1303
姓名:辛颖
学号:[1**********]24
一、实验题目:线性表
二、实验目的:
1、熟悉将算法转换为程序代码的过程;
2、了解顺序表的逻辑结构特性,熟悉掌握顺序表存储结构的C 语言描述方法;
3、熟悉掌握顺序表的基本运算:查找、插入、删除,掌握顺序表的随机存储特性;
4、了解线性表的链式存储结构及其顺序存储特性,熟悉掌握线性表的链式存储结构的C 语言描述方法;
5、熟悉掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构;
6、掌握使用链表表示特定形式数据的方法,并能编写相关运算的算法。
三、实验要求:
(1) 熟悉顺序表的插入、删除和查找。
(2) 熟悉单链表的插入、删除和查找。
(3) 熟悉双链表的插入、删除和查找。
四、实验内容和实验步骤:
1、
#include
#include
#include
#define MaxSize 20
typedef int ElemType;
typedef struct SeqList
{//线性表顺序存储结构定义
ElemType elem[MaxSize];
int length;
}SeqList;
int Init_SeqList(SeqList &L)
{ L.length=0; return 1;}
int Locate_SeqList(SeqList &L,int x)
{
int i=0;
while(i
i++;
if(i>=L.length){printf("顺序表中不存在该元素!\n");return 0;}
else return i+1;
}
int Insert_SeqList(SeqList &L,int i,int x)
{//在顺序存储结构的线性表的第i 个数据元素之前插入新元素x ,1
if(L.length>=MaxSize)
{
printf("顺序表已满,无法进行插入操作!");return 0;}
if(iL.length+1)
{
printf("插入位置不正确!");return 0;}
for(j=L.length-1;j>=i-1;j--)
{
L.elem[j+1]=L.elem[j];
L.elem[i-1]=x;
L.length++;
return 1;
}
}
int Delete_SeqList(SeqList &L,int i)
{//在顺序存储结构的线性表中删除第i 个元素,1
int j;
{ printf("删除位置不正确!");return 0;} for(j=1;j:"); scanf("%d",&i); switch (i) { case 1 : printf("请输入查找元素:");scanf("%d",&x); j=Locate_SeqList(L,x); if(j!=0) printf("指定元素位置=%d\n",j); break; case 2: printf("请输入插入元素位置:");scanf("%d",&k); printf("请输入插入元素值:"); scanf("%d",&x);
} } if(j!=0) {printf("插入后顺序表如下所示\n");Display_SeqList(L);} printf("\n"); break; case 3: printf("请输入删除元素位置:"); scanf("%d",&k); i=Delete_SeqList(L,k); if(j != 0) {printf("删除后顺序表如下所示\n"); Display_SeqList(L); printf("\n"); } break; case 0: exit(0); break; default: printf("输入有误!"); }
(1) 实现顺序表各种基本运算;
1. 以顺序表作为存储结构;
2. 实现顺序表上的数据元素的插入运算;
3. 实现顺序表上的数据元素的删除运算;
4. 实现顺序表上的数据元素的查找运算。
(2) 详细设计
(3) 调试分析:
1. 问题:指针的正确表示,以及C/C++编译软件
的问题需要处理
2. 结果
3. 总结:(*L)、关于顺序表的若干问题
2、
#include
#include
#include
#define flag 0
typedef int ElemType;
typedef struct Lnode
{//链式存储结构定义
int data;
struct Lnode *next;
}Lnode,*LinkList;
Lnode *Get_LinkList(LinkList L,int i)
{//在带头结点单链表中查找第i 个数据元素,找到返回其指针,否则返回空 Lnode *p=L;
int j=0;
while(p!=NULL&&jnext;j++;}
return p;
}
int Locate_LinkList(LinkList L,int x)
{//在带头结点单链表中查找值等于给定值的结点
LinkList p;int j=1;
p=L->next;
while(p!=NULL&&p->data!=x)
{ p=p->next;j++; }
if(p)
{ printf("%d在链表中,是第%d个元素。\n",p->data,j);return j; } else
{ printf("该数值不在链表里。\n");return 0; }
}
int Insert_LinkList(LinkList &L,int i,int x)
{//在带头结点单链表的第i 个位置之后插入值为x 的元素
Lnode *p,*s;
p=Get_LinkList(L,i);
if(p==NULL)
{ printf("参数i 输入有误!\n");return 0; }
else
{ s=(Lnode *)malloc(sizeof(Lnode));
s->data=x; s->next=p->next;
p->next=s; return 1; }
}
int Delete_LinkList(LinkList L,int i)
{//删除带头结点单链表上的第i 个数据结点
LinkList p,s;
p=Get_LinkList(L,i-1);
if(p=NULL)
{ printf("待删除结点前结点不存在!\n");return -1;}
else if(p->next==NULL)
{ printf("该结点不存在!\n");return 0; }
else
{ s=p->next;
p->next=s->next;
free(s);
return 1; }
}
void Create_LinkList(LinkList &L,int n)
{//前插法创建带头结点单链表
int i;
LinkList p;
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
for(i=n;i>0;--i)
{ p=(LinkList)malloc(sizeof(Lnode));
p->data=i;
p->next=L->next;
L->next=p; }
}
void Display_LinkList(LinkList L)
{//单链表的显示
LinkList p;p=L;
while(p->next)
{
printf("%d ",p->next->data);p=p->next;
}
}
void main(int argc,char* argv[])
{
printf("初始化\n建立单链表如下:\n");
LinkList L;
int x,y,cord,i;
Create_LinkList(L,4);
Display_LinkList(L);
do{printf("\n 主菜单 \n");
printf(" 1 尾插法插入元素导指定位置 \n"); printf(" 2 删除某一指定元素 \n");
printf(" 0 结束程序 \n");
printf("-------------------------------------\n");
printf("请输入您选的的菜单号:"); scanf("%d",&cord);
switch(cord)
{
case 1:
printf("请输入插曲元素位置前序号 i:");
scanf("%d",&x);
printf("请输入插入的数据y :");
scanf("%d",&y);
Insert_LinkList(L,x,y);
printf("单链表输出如下:\n");
Display_LinkList(L);
break;
case 2:
printf("请输入删除元素序号x=?");
scanf("%d",&x);
Delete_LinkList(L,x);
printf("单链表输出如下:\n");
Display_LinkList(L);
break;
case 3:
printf("请输入查找元素值x :");
scanf("%d",&x);
i=Locate_LinkList(L,x);
break;
case 0:
exit(0);
break;
default:
printf("输入有误!");
}
}while(cord=0);
}
(1)、实现单链表各种基本运算;
1. 以单链表作为存储结构;
2. 实现单链表上的数据元素的插入运算;
3. 实现单链表上的数据元素的删除运算;
4. 实现单链表上的数据元素的查找。
(2)、详细分析:
(3)、调试分析:
1. 问题 对于插入指针出错的问题,以及function
(*)和function (&)的问题如何解决。分配空间出现空,以及指针指向的是空。
2. 结果
3. 总结:*Linklist、关于单链表的若干问题
3、
#include
#include
#include
typedef int ElemType;
typedef struct DLnode
{
ElemType data;
struct DLnode*prior;
struct DLnode*next;
}DLnode,*DLinkList;
void Init_DLinkList(DLinkList *L)
{
*L=(DLnode*)malloc(sizeof(DLnode));
(*L)->prior=(*L)->next=NULL;
}
void Create_DLinkList(DLinkList *L,int n)
{
int i;
DLinkList p;
(*L)=(DLinkList)malloc(sizeof(DLnode));
(*L)->next=NULL;
(*L)->prior=NULL;
for(i=n;i>0;--i)
{
p=(DLinkList)malloc(sizeof(DLnode));
p->data=i;
p->next=(*L)->next;
(*L)->next=p;
if(p->next!=NULL) p->next->prior=p;
p->prior=*L;
}
return ;
}
int Locate_DLinkList(DLinkList L,ElemType e)
{
int i=1;
DLinkList p=L->next;
while(p!=NULL&&p->data!=e)
{
i++;p=p->next;
}
if(p==NULL)
{
printf("双链表中不存在该元素!\n");return 0; }
else return i;
}
int Insert_DLinkList(DLinkList *L,int i,ElemType e)
{
int j=0;
DLinkList p=*L,s;
while(p!=NULL&&j
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("插入位置不正确!\n");return 0;
}
else
{
s=(DLnode*)malloc(sizeof(DLnode));
s->data=e;
s->prior=p->prior;
s->next=p;
p->prior->next=s;
p->prior=s;return 1;
}
}
int Delete_DLinkList(DLinkList *L,int i,ElemType *e) {
int j=0;
DLinkList p=*L;
while(j
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("删除位置不正确!\n");return 0;
}
else
{
(*e)=p->data;
p->prior->next=p->next;
if(p->next!=NULL) p->next->prior=p->prior; free(p);
return 1;
}
}
void Display_DLinkList(DLinkList L)
{
DLinkList p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void main()
DLinkList L; int i,j,e,x,t; Init_DLinkList(&L); Create_DLinkList(&L,4); printf("初始化\n 建立双链表如下:\n"); Display_DLinkList(L); while(i:"); scanf("%d",&i); switch(i) { case 1: printf("请输入查找元素:"); scanf("%d",&x); j=Locate_DLinkList(L,x); if(j!=0) printf("指定元素位置=%d\n",j); break; case 2: printf("请输入插入元素位置后结点序号:"); scanf("%d",&t); printf("请输入插入元素值:"); scanf("%d",&x); j=Insert_DLinkList(&L,t,x); if(j!=0) { printf("插入后双链表如下所示:\n"); Display_DLinkList(L); } break; case 3: printf("请输入删除元素位置:"); scanf("%d",&t); j=Delete_DLinkList(&L,t,&e); if(j!=0) { printf("删除后双链表如下所示:\n");
} break; case 4: exit(0); break; default:
}
}
}
printf("输入有误"); 1) 实现双链表各种基本运算: 1. 以双链表作为存储结构; 2. 实现双链表上的数据元素的插入运算; 3. 实现双链表上的数据元素的删除运算; 4. 实现双链表上的数据元素的查找运算。 2) 详细分析: 3) 调试分析: 1. 问题:双向链表对应的prior 和next 如何实现连接的原理。以及如何实现双向查询!2. 结果 (((
3. 总结:(*L)、关于双链表的若干问题