实验项目名称:线性表的存储结构
实验目的与要求:
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 TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define List_Init_Size 100
#define List_Increment 10
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L)//构造一个空线性表
{
L.elem = (ElemType*)malloc(List_Init_Size*sizeof(ElemType));
if(!L.elem)
return(ERROR);//存储分配失败
L.length = 0;//空表长度为0
L.listsize = List_Init_Size;//初始存储容量
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)//插入一个元素
{
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
int *newbase;
int *q ,*p;
if(i<1 || i>L.length+1)
return ERROR;//i值不合法
if(L.length >= L.listsize)
{
//当前空间已满,增加分配
newbase = (ElemType*)realloc(L.elem,
(L.listsize+List_Increment)*sizeof(ElemType));
if(!newbase)
return (ERROR);//存储分配失败
L.elem = newbase;//新基址
L.listsize = L.listsize + List_Increment;//增加存储容量
}
q = &(L.elem[i-1]);//q为插入位置
for(p = &(L.elem[L.length-1]);p>=q;p--)*(p+1)=*p;//插入位置及之后的元素后移
*q = e;//插入e
++L.length;//表长增1
return OK;
}//插入操作
Status ListDetetle_Sq(SqList &L,int i,ElemType &e)//删除一个元素
{
//在顺序线性表L中删除第i个元素,
//i的合法值为1<=i<=ListLength_Sq(L)
int *p;
int *q;
if(i<1 || i>L.length+1)
return ERROR;//i值不合法
p = &(L.elem[i-1]);//p为被删除元素的位置
e = *p;//被删除的元素的值赋给e
q = L.elem + L.length-1;//表尾元素的位置
for(++p;p<=q;p++) *(p-1)= *p;//被删除元素之后的元素左移
--L.length;//表长减1
return OK;
}
Status GetElem_Sq(SqList &L,int i,ElemType &e)//查找一个元素
{
if(i<1 || i>L.length)
return ERROR;
e = L.elem[i-1];
return e;
}
Status ListLength_Sq(SqList L)//求线性表表长
{
if(L.length==0)
{
return 0;
}
return L.length;
}
Status ClearList_Sq(SqList &L)//将线性表重置为空表
{
L.length=0;
return OK;
}
Status PrintList_Sq(SqList &L)
{
int i;
if(L.length==0)
printf("线性表为空");
else
{
printf("线性表为: ");
for( i=0; i<L.length; i++) printf("%d ",L.elem[i]);
}
printf("\n");
return OK;
}
Status Operatemenu(SqList L) //操作菜单
{
printf("------****操作菜单****------\n\n");
printf("------ 0 退出系统\n");
printf("------ 1 插入一个元素\n");
printf("------ 2 查找一个元素\n");
printf("------ 3 删除一个元素\n");
printf("------ 4 输出线性表表长\n");
printf("------ 5 将线性表重置为空表\n");
printf("------ 6 输出线性表\n");
printf("------ 请选择你所需要的操作\n");
return 0;
}
int main()//主函数
{
SqList L;
int num=-1, i;
ElemType e;
if(InitList_Sq(L))
{printf("------ 线性表创建成功\n");}
while(num!=0)
{
Operatemenu(L);
scanf("%d",&num);
switch(num)
{
case 1:
printf("分别输入储存地址i和储存元素e:\n");
scanf("%d%d",&i,&e);
if(!ListInsert_Sq(L,i,e)) // 判断i值是否合法
printf("i值不合法\n");
else
{ printf("已经将%d存入顺序表\n", e);
PrintList_Sq(L);}
break;
case 2:
printf("请输入查找的位置i:");
scanf("%d",&i);
if(!GetElem_Sq(L,i,e))// 判断i值是否合法
printf("i值不合法\n");
else
{ printf("%d位置的元素为:", i);
printf("%d\n",e);}
break;
case 3:
printf("请输入删除的位置i:");
scanf("%d",&i);
if(!ListDetetle_Sq(L,i,e)) // 判断i值是否合法
printf("i值不合法\n");
else
{ printf("已经将%d位置的元素删除\n", i);
PrintList_Sq(L);}
break;
case 4:ListLength_Sq(L);
printf("线性表表长为");
printf("%d\n",L.length);
break;
case 5:ClearList_Sq(L);
printf("线性表已重置为空表\n");
PrintList_Sq(L);
break;
case 6:PrintList_Sq(L);break;
}
}
}