顺序表,顾名思义挨着一顺儿排下来的。在内存中也是如此(如图)。
1.1顺序表
使用C语言的结构体实现顺序表,定义如下
typedef struct
{
int data[Maxsize];
int length;
}Sqlist;
其中图1.1其实就是这个定义中的data[Maxsize]。如果对typedef使用不清楚的话,这个定义方式与如下等同,只是下面的简写。
struct Sqlist
{
int data[Maxsize];
int length;
};
typedef struct Sqlist Sqlist;
完整代码
#include
#include
/**************
@chapter: 1.1.1
@author: zhaozihao
@time: 2020年2月24日
@Description: 实现静态顺序表
**************/
#define Maxsize 10
/*使用字符串比较函数的声明(用于消除警告可忽略)*/
int strcmp(const char*, const char*);
typedef struct
{
int data[Maxsize];
int length;
}Sqlist;
/*与上面的等价定义法*/
/*struct Sqlist
{
int data[Maxsize];
int length;
};
typedef struct Sqlist Sqlist;*/
/*初始化顺序表*/
void InitList(Sqlist *L)
{
L->length = 0;
int i;
for(i = 0; i < Maxsize; i++)
L->data[i] = 0;
printf("初始化成功\n");
}
/*置空顺序表*/
void ClearList(Sqlist *L)
{
int k;
for(k = 0; k < L->length; k++)
L->data[k] = 0;
L->length = 0;
printf("顺序表已置空\n");
}
/*在指定位置 i 插入元素 e*/
int Insert(Sqlist *L, int i, int e)
{
if(L->length == Maxsize)
{
printf("表满\n");
return 0;
}
if(L->length == 0)
{
L->data[0] = e;
L->length++;
printf("当前表长为%d\n", L->length);
return 1;
}
if(i > L->length)
{
printf("插入位置不合理\n");
return 0;
}
int k;
for(k = L->length-1; k >= i-1; k--)
L->data[k+1] = L->data[k];
L->data[i-1] = e;
L->length++;
printf("插入 %d 当前表长 %d \n", e, L->length);
return 1;
}
/*尾插法*/
int tail_insert(Sqlist *L, int e)
{
if(L->length == Maxsize)
{
printf("表满了\n");
return 0;
}
L->data[L->length] = e;
L->length++;
printf("尾插入 %d 当前表长 %d \n", e, L->length);
return 1;
}
/*头插法*/
int head_insert(Sqlist *L, int e)
{
if(L->length == Maxsize)
{
printf("表满\n");
return 0;
}
int k;
for(k = L->length-1; k >= 0; k--)
L->data[k+1] = L->data[k];
L->data[0] = e;
L->length++;
printf("头插入 %d 当前表长 %d \n", e, L->length);
return 0;
}
/*删除指定位置元素*/
int delete_elem(Sqlist *L, int i)
{
if(i < 1 || i > L->length)
{
printf("指定位置不合理\n");
return 0;
}
int k;
for(k = i - 1; k < L->length; k++)
L->data[k] = L->data[k+1];
L->length--;
printf("删除第 %d 个元素当前表长 %d\n", i, L->length);
return 1;
}
/*取得第i个元素*/
int getElem(Sqlist *L, int i)
{
if(L->length == 0)
{
printf("表示空的\n");
return 0;
}
if(i < 1 || i > L->length)
{
printf("位置不合理\n");
return 0;
}
return L->data[i - 1];
}
/*打印, 值为e的元素的位置*/
int locateElem(Sqlist *L, int e)
{
if(L->length == 0)
{
printf("表是空的\n");
return 0;
}
int i;
/*状态值status,默认表中不存在e,
一旦发现存在则被置为true,如果直
到循环结束仍为false就可判定不存在*/
char * status = "false";
for(i = 0; i < L->length; i++)
{
if(L->data[i] == e)
{
printf("%d是表中第%d个元素\n", e, i+1);
status = "true";
}
}
if(strcmp(status, "false") == 0)
printf("表中不存在元素%d\n", e);
return 1;
}
/*展示顺序表所有元素*/
void showList(Sqlist *L)
{
if(L->length == 0)
{
printf("表示空的\n");
}
int k;
for(k = 0;k < L->length; k++)
printf("%d\t", L->data[k]);
printf("\n"); //用于换行
}
/*判空函数*/
void empty(Sqlist *L)
{
if(L->length == 0)
printf("true\n");
else
printf("false\n");
}
/*程序主函数*/
int main()
{
Sqlist seqlist;
InitList(&seqlist);
//empty(&seqlist); //调用判空函数
tail_insert(&seqlist, 11);
tail_insert(&seqlist, 33);
Insert(&seqlist, 2, 22);
head_insert(&seqlist, 0);
head_insert(&seqlist, -11);
//empty(&seqlist); //调用判空函数
showList(&seqlist);
delete_elem(&seqlist, 2);
showList(&seqlist);
locateElem(&seqlist, 22);
locateElem(&seqlist, 999);
ClearList(&seqlist);
empty(&seqlist); //调用判空函数
return 0;
}
晚安各位研友!祝前程似锦