作业题目:线性表的基本存储结构的实现与应用
顺序表与单链表是线性表的两种最基本的存储结构,而静态链表是两者的 完美结合,是系统进行动态存储分配的方法基础。线性表的这三种存储结构不但是其他数据结构(如树形结构、图型结构、集合等)存储方法的重要基础,同时本身也有广泛的应用。
作业要求
1. 实现线性表的顺序存储结构(SeqList)和链式存储结构(LinkList)。
2. 在上述存储结构的基础上,分别实现以下算法:
① 删除给定元素的算法。
② 对于已排好序的线性表,删除所有重复元素的算法。
③ 线性表“逆置”算法。
④ 线性表循环左移/右移 k 位的算法。
⑤ 合并两个已排好序的线性表的算法。
3. 选做:(可以不做,供学有余力、有兴趣的同学探索)
① 你能实现线性表的静态链表存储结构吗?
② 你能在静态链表上实现线性表的“逆置”算法吗?
存储结构
#define maxlength 100
#define ElemType int
typedef struct
{
ElemType elem[maxlength];//下标为0的单元不存放线性表中元素
int last;//最后一个元素在数组中位置
}SeqList;
部分基本操作
初始化线性表
读取初始化时元素的个数,依次将各个元素加入到线性表中,当输入元素个数大于等于maxlength时提示"Too many elements !!"。
void Assign_Initial_Value(SeqList *L)
{
int num=maxlength+1,i;
printf("Please input the number of elements:");
while(num>=maxlength)//元素个数最多为maxlength-1
{
scanf("%d",&num);
if(num>=maxlength)
{
printf("Too many elements !!\n");
}
}
printf("Input them:");
for(i=1;i<=num;i++)
{
scanf(" %d",&L->elem[i]);
}
L->last=num;
printf("success !!\n");
}
End(L) 返回最后一个元素的后一位置
给int定义别名position便于区分是否用于表示元素位置。
typedef int position
position End(SeqList L)
{
return (L.last+1);
}
插入(在p位置插入元素x)
课本(数据结构与算法(第五版)高等教育出版社 张岩等主编)中代码使用C++语法,用'&'进行引用传递。如果使用C语言,可以考虑把'&'使用'*'替换,函数调用时,用'&'传址。
插入新元素,对插入元素位置及其后面元素依次后移即可。
不要忘记对L->last进行加1操作。
void Insert (ElemType x ,position p ,SeqList *L)
{
position q;
if(L->last>=maxlength-1)//x插入前表已满
{
printf("List is full !!");
}
else if((p>L->last+1)||p<1)//x插入位置错误
{
printf("position does not exist !!");
}
else
{
for(q=L->last;q>=p;q--)
{
L->elem[q+1]=L->elem[q];//位置p后元素逐个后移
}
L->elem[p]=x;
L->last++;//勿忘
}
}
删除给定位置的元素
勿忘对L->last进行减1操作
void Delete(position p,SeqList *L)
{
position q;
if((p>L->last)||(p<1))
{
printf("position does not exist !!");
}
else
{
for(q=p;q<=(L->last);q++)
{
L->elem[q]=L->elem[q+1];
}
L->last--;
}
}
打印线性表
void Print(SeqList*L)
{
int i;
for(i=1;i<=L->last;i++)
{
printf("%d ",L->elem[i]);
}
printf("\n");
}
查找某个元素(查找某个元素第一次出现的位置)
position Locate(ElemType x,SeqList *L)
{
printf("Input the element you want to find:");
scanf(" %d",&x);
position q;
for(q=1;q<=(L->last);q++)
{
if(L->elem[q]==x)
return q;
}
return (L->last+1);//找不到则返回最后元素后一位置
}
作业中算法
1.删除给定元素的算法
该函数中调用了基本操作中的删除某一位置元素函数
void Delete_Element(ElemType x,SeqList *L)
{
int i=1;
while(i<=L->last)
{
if(L->elem[i]==x)
{
Delete(i,L);
}
else
i++;
}
}

该文章详细介绍了线性表的三种基本存储结构——顺序表、单链表和静态链表,并提供了C语言实现,包括初始化、插入、删除、查找、逆置、删除重复元素、循环移动和合并排序线性表等算法。同时,作者反思了代码设计中的不足,如变量命名、输入提示和注释规范等问题。
最低0.47元/天 解锁文章
769

被折叠的 条评论
为什么被折叠?



