实验项目名称:线性表的存储结构
实验目的与要求:
1.基础知识:掌握数据结构中线性表的相关知识;
掌握C或VC+ +语言中程序设计的方法。
2.程序功能:
(1)参考教材相关算法,分别用顺序式和链式两种存储结构实现线性表的操作;
(2)实现已建立线性表中元素的查找、插入和删除。
实验性质:验证性(4学时,其中顺序表2学时,链表2学时)
说明:程序包含的主要函数:主函数、操作界面、
建立空线性表、获取第i个元素的值、在第i个位
置前插入元素e、删除第i个元素且用e返回删除的
元素值。
注意:
(1) 应有相关注释,尤其是每个子函数的功能注释;
(2) 主函数调用子函数的逻辑顺序一主 函数调用建立线性表子函数应在调用其他子函数之前,这须在主函数中进行条件控制。
(3)在选定存储结构后,需要特别关注“表不存在”和“空表”的语句表达方式以及它们的使用时机和方式。
如:顺序表中,表达表不存在的语句是:L.elem=NULL ;
建立空表语句是:调用lnitList Sq (L) ;
在带头结点的链表中,表达表不存在的语句是:L=NULL;
建立空表语句是: L->next=NULL或者调用InitList_ L (L) ;
链式线性表
源代码:
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Lnode //结点类型
{ ElemType data;
struct Lnode *next;
}Lnode,*LinkList;
Status InitList_L(LinkList &L)//构建一个空链表
{
L=(LinkList)malloc(sizeof(Lnode));
L->next = NULL;
return OK;
}
Status ListLnsert_L(LinkList &L,int i,ElemType e)//插入操作
{
LinkList p,s;
p = L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s = (LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e)//删除操作
{
LinkList p,q;
p = L;
int j=0;
while(p->next && j<i-1)
{
p=p->next;
j++;
}
if(!(p->next) || j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e = p->data;
free(q);
return OK;
}
Status GetElem_L(LinkList &L,int i,ElemType &e)//查找操作
{
LinkList p;
int j=1;
p=L->next;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return e;
}
Status ClearList_L(LinkList &L)//清空
{
LinkList p = L;
while(p->next)
{
LinkList m = p->next;
free(p);
p=m;
}
L->next = NULL;
return OK;
}
Status PrintList_L(LinkList &L,int len)//输出
{
if (L->next!=NULL)
{
LinkList p = L->next;
printf("单链表为:\n");
for(int i=0;i<len;i++)
{
printf("%d\n",p->data);
p = p->next;
}
}
else
printf("该链表为空表\n");
return 0;
}
Status Operatemenu(LinkList L) //操作菜单
{
printf("------****操作菜单****------\n\n");
printf("------ 0 退出系统\n");
printf("------ 1 插入一个元素\n");
printf("------ 2 查找一个元素\n");
printf("------ 3 删除一个元素\n");
printf("------ 4 输出链表\n");
printf("------ 5 将链表重置为空表\n");
printf("------ 请选择你所需要的操作\n");
return 0;
}
int main()//主函数
{
LinkList L;
ElemType e;
int len=0;
int num=-1, i;
if(InitList_L(L))
{printf("------ 链表创建成功\n");}
while(num!=0)
{
Operatemenu(L);
scanf("%d",&num);
switch(num)
{
case 1:
len++;
printf("分别输入储存地址i和储存元素e:\n");
scanf("%d %d",&i,&e);
if(!ListLnsert_L(L,i,e)) // 判断i值是否合法
{printf("i值不合法\n");break;}
else
printf("已经将%d存入链表\n", e);
PrintList_L(L,len);
printf("\n");
break;
case 2:
printf("请输入查找的位置i:");
scanf("%d",&i);
if(!GetElem_L(L,i,e))// 判断i值是否合法
{printf("i值不合法\n");break;}
else
printf("%d位置的元素为:", i);
printf("%d\n",e);
break;
case 3:
printf("请输入删除的位置i:");
scanf("%d",&i);
if(!ListDelete_L(L,i,e)) // 判断i值是否合法
{printf("i值不合法\n");break;}
else
{printf("已经将%d位置的元素删除\n", i);
len--;
PrintList_L(L,len);}
break;
case 4:
PrintList_L(L,len);break;
case 5:ClearList_L(L);
printf("已重置为空表\n");break;
}
}
}