c语言版数据结构——线性表的顺序存储及实现
线性表的特点
在日常生活中,线性表的例子比比皆是。例如,26个英文字母的字母表: (A, B, C, …,Z) 是一个线性表,表中的数据元素是单个字母。在稍复杂的线性表中, 一个数据元素可以包含若干 个数据项。例如在第1章中提到的学生基本信息表,每个学生为一个数据元素,包括学号、姓名、 性别、籍贯、 专业等数据项。
由以上示例可以看出,它们的数据元素虽然不同,但同一线性表中的元素必定具有相同的特 性,即属千同一数据对象,相邻数据元素之间存在着序偶关系。
诸如此类由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表。 线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表。 对千非空的线性表或线性结构,其特点是:
(1) 存在唯一的一个被称作 “第一个" 的数据元素;
(2)存在唯一的一个被称作 “最后一个" 的数据元素;
(3)除第一个之外,结构中的每个数据元素均只有一个前驱;
(4)除最后一个之外,结构中的每个数据元素均只有一个后继。
顺序表中基本主要操作实现
当线性表用顺序表表示时,因为表的长度是顺序表的一个 “属性”,所以可以通过返回length的值实现求表长的操作, 通过判断length的值是否 为0判断表是否为空,这些操作算法的时间复杂度都是0(1)。下面讨论顺序表其他几个主要操作 的实现。
- 初始化
顺序表的初始化操作就是构造一个空的顺序表。 - 取值
取值操作是根据指定的位置序号i, 获取顺序表中第i个数据元素的值。 由千顺序存储结构具有随机存取的特点, 可以直接通过数组下标定位得到,elem[ i-1]单元存 储第)个数据元素。 - 查找
查找操作是根据指定的元素值e, 查找顺序表中第1个与e相等的元素。若查找成功,则返 回该元素在表中的位置序号;若查找失败,则返回0。 - 插入
线性表的插入操作是指在表的第l个位置插入一个新的数据元素e, 使长度为n 的线性表 (a1,a2,···ai-1,ai,ai+1,···,an) 变成长度为n+l的线性(a1,a2,···ai-1,x,ai,ai+1,···,an) 数据元素ai-1和ai之间的逻辑关系发生了变化在线性表的顺序存储结构中,由于逻辑上相邻 的数据元素在物理位置上也是相邻的,因此除非 i=n+l, 否则必须移动元素才能反映这个逻辑关系的变化。 - 删除
读者参考插入,我就不写了。
代码如下
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int num[100];
int length;
}SeqList;
void InitList(SeqList* T) { //初始化线性表
if (T != NULL) {
T->length = 0;
}
else
printf("申请失败\n");
}
void DestroyList(SeqList* T) { //销毁线性表
T->length = 0;
}
void CreateList(SeqList* T) { //创建线性表
int j=0,n;
printf("输入添加个数:");
scanf("%d", &n);
printf("输入你需要添加的元素:");
for (j = 0;j < n;j++)
scanf("%d", &T->num[j]);
T->length = n;
}
bool ListEmpty(SeqList* T) { //判断线性表是否为空
if (T->length == 0)
return true;
else
return false;
}
int GetElem(SeqList* T, int i,int *e) { /*返回T中第i个数据元素的值*/
int flag=0;
if (i >= 1 && i <= T->length) {
*e = T->num[i - 1];
flag = 1;
return flag;
}
else
return flag;
}
void LocateElem(SeqList* T, int e){ /*返回线性表中第1个与e满足关系的位置*/
int i;
for (i = 0;i < T->length;i++) {
if (T->num[i] == e)
break;
}
if (i < T->length)
printf("查找到的位置为:%d\n",i+1);
else
printf("查找位置失败\n");
}
void ListInsert(SeqList* T, int e, int i) { /*在线性表T的第i个位置插入新的数据元素e*/
int j = 0;
if (i >= 1 && i <= T->length+1&&i<=100) {
for (j = T->length;j >= i;j--) {
T->num[j] = T->num[j - 1];
}
T->num[i - 1] = e;
T->length++;
}
else
printf("操作位置错误\n");
}
void ListDelete(SeqList* T, int i) { /*删除线性表T的第i个元素*/
int j;
if (i >= 1 && i <= T->length) {
for (j = i - 1;j < T->length;j++) {
T->num[j] = T->num[j + 1];
}
T->length--;
printf("删除成功\n");
}
else
printf("操作位置错误\n");
}
int main() {
SeqList* T;
int e, i, selector,s;
bool m;
char ch;
T = (SeqList*)malloc(sizeof(SeqList));
InitList(T);
do {
printf("1.创建线性表\n");
printf("2.判断线性表是否为空\n");
printf("3.获取线性表第i个元素\n");
printf("4.定位一个数值在线性表中位置\n");
printf("5在第i个位置插入一个数\n");
printf("6.删除第i个位置的数\n");
printf("7.销毁该线性表\n");
printf("0.退出\n");
printf("请输入你的选择:");
scanf("%d", &selector);
switch(selector) {
case 1:
CreateList(T);
break;
case 2:
m = ListEmpty(T);
if (m == true)
printf("该线性表为空\n");
else
printf("该线性表不为空\n");
break;
case 3:
printf("输入i为:");
scanf("%d", &i);
s=GetElem(T, i, &e);
if(s!=0)
printf("获得数值为:%d\n", e);
else
printf("操纵位置错误\n");
break;
case 4:
printf("输入数值s:");
scanf("%d", &s);
LocateElem(T, s);
break;
case 5:
printf("输入你要插入的位置和数值:");
scanf("%d%d",&i,& s);
ListInsert(T, s, i);
break;
case 6:
printf("输入你要删除的位置i:");
scanf("%d", &i);
ListDelete(T, i);
break;
case 7:
DestroyList(T);
break;
default:
printf("选择错误\n");
}
} while (selector!=0);
return 0;
}