线性表中的元素依次存放在一个连续的存储空间中
线性表结点之间具有线性、先后、一维关系
顺序表存储结构的设计
定义:
总之:
顺序表逻辑上相邻对应物理地址相邻,通过数组存储数值就可以了。我们需要定义一个整型变量表示存储到那个位置了即可。
备用空间是因为我们不知道要存储的数值个数,定义一个尽可能大的数。
结构体定义:
typedef int ElemType;
//假定线性表元素的类型为整型
# define LIST_SIZE 1024
//假定线性表的最大长度为1024
typedef struct
{ ElemType data[LIST_SIZE];
int last; //指向最后结点的位置
} SequenList;
SequenList *LPtr;
Ptr百度时,记得是汇编语言的词汇,结点的意思。
===================================================================================================
其中最后一步操作遍历我没去实现,感觉不是很重要。
下面分别是插入、删除、查找操作。
插入:
问题描述:在顺序表第i个位置插入新元素x
你可以用下表测试
算法:
int Insert_SqList(SeqList *LPtr, ElemType x, int k)
{ int j;
if (LPtr->last>=LIST_SIZE-1) return FALSE; //溢出
else if ( k<0 || k > (LPtr->last+1)) return FALSE; //非法位置
else
{
for(j=LPtr->last; j>=k; j--) //从顺序表的最后一个元素起
{
LPtr->data[j+1]=LPtr->data[j];
//向后移动(last-k)个元素
}
LPtr-> data[k]=x; //将x放入表的k位置
LPtr-> last= LPtr-> last+1; //修改最后结点指针last
}
return TRUE;
}
删除操作:
问题描述:将顺序表第i个结点删掉(删除结点的位置为k)
算法:
int Delete_SqList(SeqList *LPtr, int k)
{
if (( k >= 0 && k<= LPtr->last) &&( LPtr->last!=0))
{
for ( int j = k; j <= LPtr->last; j++ )
{
LPtr->data[j] = LPtr-> data[j+1];
}
LPtr->last --;
return TRUE; //成功删除
}
return FALSE; //异常情形
}
测试样例:
查找操作:
定义:
设计一个从数组下标从0到last之前的比较
函数结构设计:
算法:
int Locate_SqList(SeqList *LPtr, ElemType key)
{
for(int i=0; i< LPtr->last; i++)
if(LPtr->data[i]== key) return i;
return -1;
}
测试样例:
顺序表操作代码
#include<Stdio.h>
#include<malloc.h>
typedef int ElemType;
#define LIST_SIZE 1024
#define FALSE 0
#define TRUE 1
typedef struct {
ElemType data[LIST_SIZE];
int last;
} SeqList;
SeqList *LPtr;
/*=========================================
函数功能:顺序表运算——建立顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
void creat_list(SeqList *LPtr) {
int i;
printf("请输入线性表的长度:");
scanf("%d",&LPtr->last);
for(i=0; i<LPtr->last; i++) {
printf("数据%d=",i);
scanf("%d",&(LPtr->data[i]));
}
}/*输出线性表*/
///*=========================================
//发现这一段不怎么需要
//函数功能:顺序表运算——初始化
//函数输入:顺序表地址
//函数输出:空
//===========================================*/
//void InitList(SeqList *LPtr) {
// LPtr=(SeqList *)malloc(sizeof(SeqList));
// LPtr->last=0;
//}
/*=========================================
函数功能:顺序表运算——清空顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
int Listqingkong(SeqList *L) {
L->last=0;
}
/*=========================================
函数功能:顺序表运算——销毁顺序表
函数输入:顺序表地址
函数输出:空
===========================================*/
void DestroyList(SeqList *LPtr) {
free(LPtr);
}
/*=========================================
函数功能:顺序表运算——空表判断
函数输入:顺序表地址
函数输出:判断标志——0:空 1:非空
===========================================*/
bool ListEmpty(SeqList *LPtr) {
return(LPtr->last);
}
/*=========================================
函数功能:顺序表运算——求线性表长度
函数输入:顺序表地址
函数输出:线性表长度
===========================================*/
int ListLength(SeqList *LPtr) {
return(LPtr->last);
}
/*=========================================
函数功能:顺序表运算——输出线性表
函数输入:顺序表地址
函数输出:输出线性表结点
===========================================*/
void DispList(SeqList *LPtr) {
for(int i=0; i<LPtr->last; i++)
printf("%d ", LPtr->data[i]);
printf("\n");
}
/*=========================================
函数功能:顺序表运算——元素的插入
函数输入:顺序表地址,插入值,插入位置
函数输出:完乘标志——0:异常 1:正常
===========================================*/
int Insert_SqList(SeqList *LPtr, ElemType x, int k) {
int j;
if(LPtr->last>=LIST_SIZE-1) return FALSE; //溢出
else if (k<0||k>(LPtr->last+1)) return FALSE; //非法位置
else {
for(j=LPtr->last; j>=k; j--) { //from last move data
LPtr->data[j+1]=LPtr->data[j];
//move (last-k+1) data
}
LPtr->data[k]=x; //将x放入表的k位置
LPtr->last=LPtr->last+1; //修改最后结点指针 last
}
return TRUE;
}
/*=========================================
函数功能:顺序表运算——元素的删除
函数输入:顺序表地址,删除位置
函数输出:完成标志——0:异常 1:正常
===========================================*/
int Delete_SqList(SeqList *LPtr, int k) {
if((k>=0&&k<=LPtr->last)&&(LPtr->last!=0)) {
for(int j=k; j<=LPtr->last; j++) {
LPtr->data[j]=LPtr->data[j+1];
}
LPtr->last--;
return TRUE; //成功删除
}
return FALSE; //异常情形
}
/*=========================================
函数功能:顺序表运算——取给定下标的元素值
函数输入:顺序表地址,下标位置
函数输出:完成标志——0:异常 1:正常
===========================================*/
int Get_SqList(SeqList *LPtr,int i,ElemType &e) {
if(i<0||i>LPtr->last) return FALSE;
if(LPtr->last<=0) return FALSE;
e=LPtr->data[i];
return TRUE;
}
/*=========================================
函数功能:顺序表运算——查找值为e的元素序号
函数输入:顺序表地址,查找元素
函数输出:元素序号
===========================================*/
int Locate_Elem(SeqList *LPtr,ElemType e) {
int i=0;
while(i<LPtr->last&&LPtr->data[i]!=e)
i++;
if(i>=LPtr->last)
return FALSE;
else
return i+1;
}
测试代码
#include"SequenList.cpp" //包含顺序表基本运算算法
SeqList a;
/*函数声明*/
void creat_list(SeqList *L);//建立
void DispList(SeqList L);//输出
int Insert_SqList(SeqList *L,int i,ElemType e);//插入
ElemType Delete_SqList(SeqList *L,int i);//删除
int Locate_Elem(SeqList L,ElemType e);//定位
int ListLength(SeqList L);//表长
void DestroyList(SeqList *L);
//清空
/*主函数*/
main() {
int i,k,loc;
ElemType e,x;
char ch;
do {
printf("\n\n\n");
printf("\n 1.建立线性表");
printf("\n 2.插入元素");
printf("\n 3.删除元素");
printf("\n 4.查找元素");
printf("\n 5.计算表长");
printf("\n 6.清空");
printf("\n 7.销毁线性表");
printf("\n 0.结束程序运行");
printf("\n=======================");
printf("\n 请输入您的选择(1,2,3,4,5,6,0)");
scanf("%d",&k);
switch(k) {
case 1: {
creat_list(&a);
DispList(&a);
}
break;
case 2: {
printf("\n 请输入插入位置(大于或等于1,小于或等于%d):",a.last+1);
scanf("%d",&i);
printf("\n 请输入要插入的元素值:");
scanf("%d",&e);
Insert_SqList(&a,i,e);
DispList(&a);
}
break;
case 3: {
printf("\n 请输入删除位置(大于或等于1,小于或等于%d):",a.last);
scanf("%d",&i);
x=Delete_SqList(&a,i);
if(x!=0) {
printf("\n 删除成功! \n");
printf(" 删除后的表: \n");
DispList(&a);
}
else printf("要删除的元素不存在!");
}
break;
case 4: {
printf("\n 请输入要查找的元素值:");
scanf("%d",&e);
loc=Locate_Elem(&a,e);
if(loc==-1) printf("\n 未找到指定元素!");
else printf("\n 已经找到,元素位置是%d",loc);
}
break;
case 5: {
ListLength(&a);
}
break;
case 6: {
Listqingkong(&a);
}
break;
case 7: {
DestroyList(&a);
}
break;
}/*switch*/
} while(k!=0);
printf("\n 按enter键 返回");
ch=getchar();
}
最后,在跟着书本写代码时,还遇到很多问题,比如,error有一个[ala],当时通过百度了解到是显然,很明显的意思,当然只是觉得很有趣,另外还遇到关于ElemType不能转换int型的错误,真是,好不容易拾起来的差点又选择了放弃,还有就是测试代码的问题,一开始在书上找到一个很不整洁的代码,意思是结构感没有,单纯是人家用来测试的,当然,我认为自己还不够,所以在网上找到一个结构感清晰的代码。
写完之后,愈发感觉仅仅c还不够,希望能快点完成数据结构与算法的总结与练习,毕竟时间太紧了。