俗话说,好记性不如一个烂笔头,在过了若干天之后我果然忘了顺序表的实现…
以此写一篇文章,防止自己忘记也帮助刚入门的小伙伴。
顺序表也就是采用一片连续的内存空间来存储相应的数据,既然是连续也就造成了空间必然有限,但带来的优点也有很多,比如操作很快,理解容易…既然时连续的内存空间,采取数组的形式是最为方便的了。
顺序表的基本操作的实现还是蛮简单的,
主要操作有
Status List_Init(SqListPtr L);//初始化列表
void List_Destory(SqListPtr L); //销毁列表
void List_Clear(SqListPtr L); //清空列表
bool List_Empty(SqListPtr L); //判断列表是否为空
int List_Size(SqListPtr L); //返回列表的元素个数
Status List_Retrieve(SqListPtr L, int pos,ElemType * elem);//取出位置pos处的元素
Status List_Locate(SqListPtr L,ElemType elem,int * pos);//定位elem所在的位置
Status List_Insert(SqListPtr L, int pos, ElemType elem);//在pos处插入elem
Status List_delete(SqListPtr L, int pos);//删除pos处的元素
Status List_Prior(SqListPtr L, int pos, ElemType * elem);//取出pos的前驱元素
Status List_Next(SqListPtr L, int pos, ElemType * elem);//取出pos的后继元素
void List_display(SqListPtr L);//将现行表中的元素输出
请忽略status带来的效果(判断是否执行成功暂且不重要)
顺序表主要依靠下标来插入,删除,找到相应元素,这里就不将所有的基本操作贴上来了。
相应解释在注释中!
选取一部分操作进行解释,所有函数均定义成void型方便理解,
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MAX 100
typedef struct LinkList{
int *elem;//定义一个指针变量,用来存取一片连续的内存空间的首地址
int LinkList_Size;//顺序表当前长度
int LinkList_MaxSize;//顺序表最大长度
}LinkList,*LinkListPtr;//LinkListPtr 指向顺序表的指针
void LinkList_Init(LinkListPtr L){//初始化顺序表
L->elem = (int *)malloc(sizeof(int)*MAX);//开辟相应的内存空间,malloc有点细节建议看看百度百科
L->LinkList_Size = 0;//开始 当前顺序表的长度为0
L->LinkList_MaxSize = MAX;//设置最大上限
}
void LinkList_Create(LinkListPtr L,int elem){//存取数据
if(L->LinkList_Size == L->LinkList_MaxSize){//判断顺序表是否满了
printf("顺序表已满!\n");
return ;
}
L->elem[L->LinkList_Size] = elem;//存数据
L->LinkList_Size++;//长度加一
}
void LinkList_Insert(LinkListPtr L,int pos,int elem){//在指定位置插入指定元素
if(pos < 1 || pos > L->LinkList_Size +1 ){//插入的位置不能小于1和大于末尾
printf("插入位置不合法!\n");
return ;
}
if(L->LinkList_Size == L->LinkList_MaxSize){//判断顺序表是否满了
printf("顺序表已满!\n");
return ;
}
for(int i = L->LinkList_Size ; i >= pos ; i--){//开始移动数据,从最后元素开始移动
//每一个元素都往后移动一位
L->elem[i] = L->elem[i - 1];
}
L->elem[pos -1 ] = elem;//在指定位置插入元素
L->LinkList_Size++;//长度加一
}
void LinkList_Print(LinkListPtr L){
if(L->LinkList_Size == 0){
printf("顺序表为空!\n");
return ;
}
for(int i = 0;i<L->LinkList_Size;i++){//打印顺序表
printf("%d\t",L->elem[i]);
}
printf("\n");
}
void LinkList_Delete(LinkListPtr L,int pos){
if(pos < 1 || pos > L->LinkList_Size){//判断删除的位置是否合法
printf("要删除的位置不合法!\n");
return ;
}
for(int i = pos -1 ;i < L->LinkList_Size ; i++){//从要删除的位置开始移动,所有元素都往前移动一位
L->elem[i] = L->elem[i+1];
}
L->LinkList_Size--;//长度减一
}
int main(){
system("color 9F");
LinkList L;
LinkList_Init(&L);
int x;
//测试用
printf("输入顺序表的元素(0结束输入):\n");
while(1){
scanf("%d",&x);
if(x) LinkList_Create(&L,x);
else break;
}
LinkList_Print(&L);
LinkList_Delete(&L,2);
LinkList_Print(&L);
LinkList_Insert(&L,2,99);
LinkList_Print(&L);
}
Ps:看不懂的操作,想不明白的操作,拿出纸笔,画就完事了!!!