一、什么是顺序表
1.顺序表就是逻辑上元素之间相临且元素在物理上的存储地址也相邻的线性表,我们可以将其看作结构体类型的数组,顺序表中除了头元素与尾元素外其他任意的元素有且仅有唯一的前驱元素和后继元素。
二、顺序表的两种实现
1.静态顺序表:
1.由于静态顺序表中的数据域为数组,无法扩容,不是我们的侧重点。
2.结构体的定义:
typedef struct node{
int data[100];//顺序表的数据域
int length;//顺序表的长度
}SeqList;
2.动态顺序表:
1.动态顺序表的数据域为指针类型,我们在顺序表的长度不够时可以对该指针进行扩容,会是顺序表更加的灵活。
2.动态顺序表的定义:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define INITSIZE 10//初始化时给定的顺序表的最大长度
typedef struct {
int *data;//指向顺序表的元素数组的指针
int MAXSIZE;//顺序表的最大元素个数
int length;//顺序表的当前的元素个数
}SqList;
3.初始化操作:
void InitSqList(SqList * L){
L->data = (SqList*)malloc(sizeof(SqList)*INITSIZE);//给data指针申请INITSIZE个SqList结构体的空间。
L->MAXSIZE = INITSIZE;//将顺序表的最大长度更新为INITSIZE
L->length = 0;//将顺序表的元素个数初始化为0
printf("初始化成功\n");
}
4.检查容量:当你插入的元素的个数大于顺表当前的最大长度时就扩容。
void Add(SqList * L,int len){
//定义一个指针指向L->data,防止L->data的空间丢失。
SqList * p = L->data;
//为L->data其申请INITSIZE+len个SqList结构体的空间
L->data = (SqList*)malloc(sizeof(SqList)*(INITSIZE+len));
//将p指针指向的空间的内容复制到L->data指针指向的空间中
for(int i = 0; i < L->length; i++){
L->data[i] = p[i];
}
//4.释放p指针的空间
free(p);
p = NULL;
printf("扩容成功\n");
}
5.创建顺序表:
/*3.创建顺序表 */
void CreateList(SqList* L,int len){
//1.判断创建元素的个数是否超出顺序表的最大长度
if(len > L->MAXSIZE){
printf("创建元素的个数是否超出顺序表的最大长度,请进行扩容\n");
return;
}
//2.判断len是否合法
if(len <= 0){
printf("len不合法\n");
return;
}
printf("请你输入%d个数据\n",len);
for(int i = 0; i < len; i++){
scanf("%d",&L->data[i]);
L->length++;
}
printf("创建成功\n");
}
6.打印顺序表的内容:
/*4.打印顺序表的内容*/
void PrintList(SqList L){
if(L.length == 0){
printf("顺序表为空\n");
return;
}
for(int i = 0; i < L.length; i++){
printf("%d\t",L.data[i]);
}
printf("打印成功\n");
}
6.向指定位置插入数据,位置index为下表+1
bool InsertList(SqList* L,int index,int element){
//1.判断顺序表是否为空
if(L->length == 0){
printf("顺序表为空\n");
return false;
}
//2.判断index是否合法
if(index < 1 || index > L->length){
printf("输入的下表不合法\n");
return false;
}
for(int i = L->length - 1; i >= index-1; i--){
L->data[i+1] = L->data[i];
}
L->data[index - 1] = element;
L->length++;
printf("插入成功\n");
return true;
}
7.删除顺序表的元素,根据位置index
bool DeleteByIndex(SqList* L,int index,int *element){
//1.判断顺序表是否为空
if(L->length == 0){
printf("顺序表为空\n");
return false;
}
//2.判断index是否合法
if(index < 1 || index > L->length){
printf("输入的删除的位置不合法\n");
return false;
}
*element = L->data[index - 1];
for(int i = index - 1; i < L->length; i++){
L->data[i] = L->data[i+1];
}
L->length--;
printf("删除成功\n");
return true;
}
8.根据输入的值删除顺序表中的元素,返回删除元素的个数
int DeleteByValue(SqList* L,int element){
int count = 0;
//1.判断顺序表是否为空
if(L->length == 0){
printf("顺序表为空\n");
return -1;
}
for(int i = 0; i < L->length; i++){
if(L->data[i] == element){
for(int j = i; j < L->length; j++){
L->data[j] = L->data[j+1];
}
count++;
}
}
L->length -= count;
return count;
}
9.查找顺序表中的数据,根据位置index
int SelectByIndex(SqList L,int index){
//1.判断顺序表是否为空
if(L.length == 0){
printf("顺序表为空\n");
return -1;
}
//2.判断index是否合法
if(index < 1 || index > L.length){
printf("输入的删除的位置不合法\n");
return -2;
}
return L.data[index-1];
}
10.查找顺序表中元素的位置,根据值
int SelectByValue(SqList L,int element){
//1.判断顺序表是否为空
if(L.length == 0){
printf("顺序表为空\n");
return -1;
}
for(int i = 0; i < L.length; i++){
if(L.data[i] == element){
return i + 1;
}
}
}
11.修改指定位置(index)的元素值
bool UpdateByIndex(SqList* L,int index){
//1.判断顺序表是否为空
if(L->length == 0){
printf("顺序表为空\n");
return false;
}
//2.判断index是否合法
if(index < 1 || index > L->length){
printf("输入的删除的位置不合法\n");
return false;
}
printf("请你输入你要修改的元素的新值\n");
int element;
scanf("%d",&element);
L->data[index-1] = element;
printf("修改成功\n");
}
12.主函数
int main(){
SqList L;
InitList(&L);
CreateList(&L,8);
PrintList(L);
// InsertList(&L,3,100);
// PrintList(L);
// int element;
// DeleteByIndex(&L,3,&element);
// PrintList(L);
// printf("被删除的元素为%d\n",element);
// int n = DeleteByValue(&L,1);
// PrintList(L);
// printf("被删除元素的个数为%d\n",n);
printf("查找位置为3的元素为%d\n",SelectByIndex(L,3));
printf("元素为8在顺序表的位置为%d\n",SelectByValue(L,8));
printf("修改位置为1所的元素值为1000\n",UpdateByIndex(&L,1));
PrintList(L);
}
其余功能可以自行测试。