c语言数据结构之顺序表:
顺序表的结构跟数组比起来还是很像的,相比于链表,数据表的优势主要体现在他的查询速度上,而链表的优势相反,查询速度慢,但对于插入一个数据来说还是比较快的
下面我们就来创建一个顺序表
1:定义数据类型,我定义的是一个学生的结构体类型,首先先宏定义一个sizemax的不变量,代表顺序表的最大长度,typedef也是一个宏定义,定义好后就可以用ElemType代替STU了,当然也可以是别的变量,
#define Size_max 100
typedef ElemType;
struct STU student{
int s_id;
char s_name[10];
}STU;
typedef struct{
ElemType data[Size_max];
int length;
}SqList;
2:下面我们先初始化这个顺序表,将这个顺序表的length变为0就可以了
//初始化线性表
void InitList(SqList *L){
L->length = 0;
}
3:求得顺序表的长度
//线性表长度
int GetLength(SqList *L){
return L->length;
}
4:我们可以求的得到顺序表的第i个元素,如果i不在顺序表的范围内,就返回0,否则就赋值,并返回1;
//线性表的i个元素
int GetElem(SqList *L,int i,ElemType *e){
if(i < 1||i>L->length){
return 0;
}
else{
*e = L->data[i-1];
return 1;
}
}
4:在顺序表中我们可以通过一个定值来得到其顺序表中的位置从而得到具体的数据,比如通过一个学生的id,得到同学的具体信息
//按值查找
int GetLocate(SqList *L,ElemType x){
int i = 0;
while(i < L->length&&L->data[i]->s_id != x->s_id){
i++;
}
if(i >= L->length)return 0;
else return (i+1);
}
5:对了忘记讲插入算法了,插入一个元素也是比较简单的
//插入元素
int InsertElem(SqList *L,int i,ElemType x){
if(i < 1||i > L->length+1){
return 0;
}
for(int j = L->length;j > i;j--){
L->data[j] = L->data[j-1];
}
L->data[i-1] = x;
L->length++;
return 1;
}
6:除了上一种插入方法,我还写了在尾部添加元素的方法
//添加元素
int addElem(SqList *L,ElemType x){
if(L->length == Size_max)
return 0;
L->data[L->length] = x;
return 1;
}
7:顺序表中删除元素也是比较简单的,只需要用被删除的元素后面的元素将其覆盖就好了
//删除元素
int DeleteElem(SqList *L,int i){
if(i < 1|| i>L->length){
return 0;
}
for(int j = i;j < L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
8:最后只需要输出所有的元素即可
//输出元素
void Output(SqList *L){
for(int i = 0;i<L->length; i++){
printf("%5d%5s",L->data[i]->s_id,L->data[i]->s_name);
}
}
最后
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Sqlist.h"
STU e;
void showFunction(){
printf("0.初始化\n");
printf("1.添加学生\n");
printf("2.删除学生\n");
printf("3.根据id查询\n");
printf("4.插入学生\n");
printf("5.打印名单\n");
printf("6.退出");
}
void selectFunction(int x,SqList *L){
select:
switch(x){
case 0:
InitList(L);
break;
case 1:
{
printf("id name\n");
printf("输入-1停止");
while(1){
int s_id;
char s_name[10];
scanf("%d %s",&s_id,&s_name);
if(s_id == -1)
break;
e.s_id = s_id;
strcpy(e.s_name,s_name);
addElem(L,e);
}
}
break;
case 5:
Output(L);
break;
}
}
int main(){
int i;
SqList *L = (SqList *)malloc(sizeof(SqList));
while(1){
showFunction();
scanf("%d",&i);
selectFunction(i,L);
}
}