顺序表
计算机内部存储一张线性表是用一组连续地址内存单元,这种存储结构即为顺序存储结构,这种结构下的线性表叫顺序表。
顺序表有两种定义方法:
1.静态定义
2.动态生成
顺序表是最简单的一种线性存储结构,优点:构造简单,操作方便,通过顺序表的首地址(或数组名)可直接对表进行随机存取
缺点:可能浪费存储空间,插入或者删除时候需要对后边一系列的数据进行操作,效率低
下面举两个实例并附上c语言代码+注释来理解
静态顺序表
/******************************************************************************** 创建一个静态的顺序表存放整数,大小为10,完成以下的操作 1.输入6个整数,打印出顺序表的内容,并显示表中剩余空间的个数 2.在顺序表的第三个位置处插入元素0,打印出表中的内容,并显示空间中剩余的个数 3.再试图插入表中第11个位置整数0,程序提示超出范围 4.删除表中第6个元素,最后显示空间中剩余的个数 *********************************************************************************/ #include <stdio.h> #include <stdlib.h> #define MaxSize 10 /** 函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */ /** 向顺序表中插入元素 */ /** 参数Sqlist:表首地址 */ /** 参数*len:表的长度 */ /** 参数i:插入元素的位置 */ /** 参数x:待插入的元素值 */ void insertElem(int Sqlist[] , int *len , int i , int x) { int t; if(*len==MaxSize || i<1 || i>*len+1) //长度为len的顺序表可插入的位置为1-len+1 其余的还有表已满的情况均超出范围 { printf("非法插入\n"); return; } for(t = *len-1 ; t>=i-1 ; t--) Sqlist[t+1] = Sqlist[t]; //将i-1后的元素顺序后移一个元素的位置 Sqlist[i-1] = x; //插入元素 *len = *len+1; //表长加1 } /** 函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */ /** 向顺序表中删除元素 */ /** 参数Sqlist:表首地址 */ /** 参数*len:表的长度 */ /** 参数i:插入元素的位置 */ void DelElem(int Sqlist[] , int *len , int i) { int j; if(i<1 || i>*len) { printf("非法删除\n"); return; } for(j =i ; j<=*len-1 ; j++) Sqlist[j-1] = Sqlist[j]; *len = *len-1; } /** 测试函数 根据题目要求 */ int main() { int Sqlist[MaxSize]; int len; int i; for(i = 0 ; i<6 ; i++) { scanf("%d",&Sqlist[i]); } len = 6; for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩余空间为%d\n" , MaxSize - len); insertElem(Sqlist , &len , 3 , 0); //表中第三个位置插入整数0 for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩余空间为%d\n" , MaxSize - len); insertElem(Sqlist , &len , 11 , 0); //表中第11个位置插入0 DelElem(Sqlist , &len , 6); //删除第六个元素 for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩余空间为%d\n" , MaxSize - len); return 0; }
动态顺序表
/******************************************** *动态的创建一个顺序表 *初始长度10,向顺序表中输入15个整数,并打印 *再删除顺序表中的第五个元素,打印出结果 ********************************************/ #include<stdio.h> #include<conio.h> #define MaxSize 10 #include<bits/stdc++.h> /* 定义一个结构体Sqlist */ typedef struct{ int *elem; //指向顺序表的首地址 int length; //顺序表中表的长度(表中元素的个数) int listsize; //顺序表存储空间容量 }Sqlist; /* 通过一个函数initSqlist实现动态的生成一个顺序表 初始化一个顺序表 */ /* 参数L:Sqlist类型的指针 因为是指针所以可以在函数中直接对顺序表进行操作 */ void initSqlist(Sqlist *L){ //调用malloc函数动态分配一段空间,并将空间首地址赋给L的elem成员,L->elem指向顺序表的首单元 L ->elem = (int *)malloc(MaxSize*sizeof(int)); if(!L ->elem) exit(0); L -> length = 0; //置0表示表空 刚生成 L -> listsize = MaxSize; //置MaxSize 表示空间大小 }//Sqlist类型的变量L就代表了一张顺序表 可以灵活操作 L->elem头地址 L->length长度 L->MaxSize容量 /******************** *向顺序表中插入元素 *参数L :Sqlist类型的指针 *参数i:插入元素的位置 *参数item:插入的元素 *********************/ void InsertElem(Sqlist *L, int i, int item){ //向顺序表L中的第i个位置插入元素item int *base, *insert_ptr, *p; if(i < 1 || i > L->length+1) exit(0); //非法插入 退出 if(L->length >= L->listsize) { //realloc函数重新追加空间 ******动态顺序表的优势******** 静态顺序表内存大小固定不变 动态可以随时扩充 base = (int *)realloc(L->elem, (L->listsize +10)*sizeof(int)); L->elem = base; //更新内存基址 L->listsize = L->listsize + 100; //内存空间增大100单元 } insert_ptr = &(L ->elem[i-1]); //insert_ptr为插入位置 for(p = &(L ->elem[L->length-1]); p >= insert_ptr; p--) *(p+1) =* p; //将i-1后的元素顺序后移一个元素的位置 * insert_ptr = item; //在第i个位置上插入元素item L->length++; //表长+1 } /******************** *从顺序表中删除元素 *参数L :Sqlist类型的指针 *参数i:删除元素的位置 *********************/ void DelElem(Sqlist *L, int i) { //从顺序表L中删除第i个元素 int *delitem, *q; if(i < 1 || i > L->length) exit(0); //非法删除 delitem = &(L->elem[i-1]); //delitem指向第i个元素 q = L->elem + L->length-1; //q指向表尾 for(++delitem; delitem <= q; ++delitem)*(delitem-1) =* delitem; //将第i位置以后的元素依次前移 L->length--; //表长-1 } /******************** *测试函数 *********************/ int main() { Sqlist l; int i; initSqlist(&l); printf("表中数据:"); for(i =0; i<15; i++) InsertElem(&l, i+1, i+1); for(i = 0; i<l.length; i++) printf("%3d",l.elem[i]); printf("\n删除后的结果:"); DelElem(&l, 5); for(i = 0; i<l.length; i++) printf("%3d",l.elem[i]); getche(); return 0; }