顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可以分为:
1. 静态顺序表:使用定长数组存储元素
2. 动态顺序表:使用动态开辟的数组存储。
静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空 间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间 大小,所以下面我们实现动态顺序表
实现的接口如下
typedef struct Seqlist
{datatype* data; //动态内存首地址int sz; //实际存储数据大小int capacity; //数据表容量
}SL;
//顺序表初始化
void seqlist_init(SL* seqlist);
//顺序表打印
void seqlist_Print(SL* seqlist);
//动态内存空间检查
void seqlist_capacity_check(SL* seqlist);
//顺序表插入的位置
int seqlist_location(SL* seqlist);
//选定位置插入值
void seqlist_insert(SL* seqlist, int input, datatype value);
//前向插入
void seqlist_front_push(SL* seqlist,datatype value);
//后向插入
void seqlist_back_push(SL* seqlist, datatype value);
//选定位置删除值
void seqlist_erase(SL* seqlist, int input);
//前向删除
void seqlist_front_pop(SL* seqlist);
//后向删除
void seqlist_back_pop(SL* seqlist);
//搜索值
int seqlist_search(SL* seqlist,datatype value);
//修改值
void seqlist_modify(SL* seqlist,int location, datatype value);
//销毁动态内存
void seqlist_destory(SL* seqlist);
具体接口代码以及菜单代码如下
test.c文件代码
#include "SeqList.h"void menu()
{printf("*********************************\n");printf("**1.Front_ADD 2.Back_ADD**\n");printf("**3.Front_DEL 4.Back_DEL**\n");printf("**5.Modify 6.Search **\n");printf("**7.Insert 8.DEL **\n");printf("**9.Print 0.Exit **\n");printf("*********************************\n");
}
enum Some_option
{Exit = 0,Front_ADD,Back_ADD,Front_DEL,Back_DEL,Modify,Search,Insert,DEL,Print
};void main()
{SL s;seqlist_init(&s);int option;datatype val;int loca;do {menu();printf("请输入:");scanf("%d", &option);switch (option){case Front_ADD:printf("请输入需要输入的值:");scanf(datainput, &val);seqlist_front_push(&s, val);break;case Back_ADD:printf("请输入需要输入的值:");scanf(datainput, &val);seqlist_back_push(&s, val);break;case Front_DEL:seqlist_front_pop(&s);break;case Back_DEL:seqlist_back_pop(&s);break;case Modify:loca = seqlist_location(&s);if(loca){printf("请输入需要修改的值:");scanf(datainput, &val);seqlist_modify(&s, loca, val);}break;case Search:printf("请输入需要搜索的值:");scanf(datainput, &val);break;case Insert:loca = seqlist_location(&s);if (loca){printf("请输入需要插入的值:");scanf(datainput, &val);seqlist_insert(&s, loca - 1, val);}break;case DEL:loca = seqlist_location(&s);if (loca){seqlist_erase(&s, loca);}break;case Print:seqlist_Print(&s);break;case Exit:seqlist_destory(&s);break;default:printf("输入错误请重新输入\n");}} while (option);return;
}
SeqList.c代码
#include "SeqList.h"void seqlist_init(SL* seqlist)
{datatype* temp = (datatype*)malloc(sizeof(datatype) * 5);if (temp == NULL){perror("seqlist_init:");return;}seqlist->data = temp;seqlist->sz = 0;seqlist->capacity = 5;
}
void seqlist_Print(const SL* seqlist)
{int start;printf("Index:");for (start = 0; start < seqlist->sz; start++){printf(datashow, start + 1);}printf("\n");printf("Value:");for (start = 0; start < seqlist->sz; start++){printf(datashow, seqlist->data[start]);}printf("\n");
}
void seqlist_capacity_check(SL* seqlist)
{if (seqlist->sz == seqlist->capacity){seqlist->capacity *= 2;datatype* temp = (datatype*)(realloc(seqlist->data,seqlist->capacity*sizeof(datatype)));if (temp == NULL){perror("realloc:");return;}seqlist->data = temp;}
}
int seqlist_location(SL* seqlist)
{int input;seqlist_Print(seqlist);do{printf("请输入位置:");scanf("%d", &input);if (input<0 || input > seqlist->sz){printf("输入越界\n");return 0;}} while (input<0 || input > seqlist->sz);return input;
}
void seqlist_insert(SL* seqlist,int input,datatype value)
{seqlist_capacity_check(seqlist);int end;for (end = seqlist->sz ; end >= input; end--){seqlist->data[end] = seqlist->data[end-1];}seqlist->data[input] = value;seqlist->sz++;
}
void seqlist_front_push(SL* seqlist,datatype value)
{seqlist_insert(seqlist, 0, value);
}
void seqlist_back_push(SL* seqlist, datatype value)
{seqlist_insert(seqlist, seqlist->sz, value);
}
void seqlist_erase(SL* seqlist, int input)
{int start;for (start = input; start < seqlist->sz; start++){seqlist->data[start - 1] = seqlist->data[start];}seqlist->sz--;
}
void seqlist_front_pop(SL* seqlist)
{seqlist_erase(seqlist, 1);
}
void seqlist_back_pop(SL* seqlist)
{seqlist_erase(seqlist, seqlist->sz);
}
int seqlist_search(const SL* seqlist, datatype value)
{int index;for (index = 0; index < seqlist->sz; index++){if (seqlist->data[index] == value){return index;}}printf("value doesn't exist");return -1;
}
void seqlist_modify(SL* seqlist, int location, datatype value)
{seqlist->data[location-1] = value;
}
void seqlist_destory(SL* seqlist)
{free(seqlist->data);seqlist->data = NULL;
}
SeqList.h代码
//顺序数据表
// 完成头删\头插\尾删\尾插\自定义位置删除插入\搜索\修改\显示
//内存采用动态内存开辟
#define _CRT_SECURE_NO_WARNINGS
#ifndef __SEQLIST__H__
#define __SEQLIST__H__
#endif
#define datatype int
#define datashow "%-3d "
#define datainput "%d"
#include <stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
typedef struct Seqlist
{datatype* data; //动态内存首地址int sz; //实际存储数据大小int capacity; //数据表容量
}SL;
//顺序表初始化
void seqlist_init(SL* seqlist);
//顺序表打印
void seqlist_Print(SL* seqlist);
//动态内存空间检查
void seqlist_capacity_check(SL* seqlist);
//顺序表插入的位置
int seqlist_location(SL* seqlist);
//选定位置插入值
void seqlist_insert(SL* seqlist, int input, datatype value);
//前向插入
void seqlist_front_push(SL* seqlist,datatype value);
//后向插入
void seqlist_back_push(SL* seqlist, datatype value);
//选定位置删除值
void seqlist_erase(SL* seqlist, int input);
//前向删除
void seqlist_front_pop(SL* seqlist);
//后向删除
void seqlist_back_pop(SL* seqlist);
//搜索值
int seqlist_search(SL* seqlist,datatype value);
//修改值
void seqlist_modify(SL* seqlist,int location, datatype value);
//销毁动态内存
void seqlist_destory(SL* seqlist);