线性表
顺序表即线性表的顺序存储,它是用一组地址连续的存储单元依次存储顺序表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
线性表的定义和基本操作
- 定义
- 基本操作
线性表的顺序表示
- 顺序表的定义
- 顺序表的操作
线性表的链式表示
-
单链表的定义
-
单链表的操作
-
双链表的操作
-
循环链表的操作
-
静态链表的操作
-
逆置问题
-
逻辑顺序与物理顺序相同 ;
-
随机访问 ;
-
每个结点只存储数据元素;
-
插入、删除操作需要移动大量元素
c语言描述(静态分配)
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct
{
int data[MaxSize];
int length;
}SqList;
SqList* InitList(); //构造一个顺序表
int Length(SqList *L); //顺序表长度
int LocateElem(SqList *L, int e); //返回L中元素e的位置
int GetElem(SqList *L, int i); //返回L中第i位置元素值
bool ListInsert(SqList *L, int i, int e); //在L中第i个位置插入元素e
bool ListDelete(SqList *L, int i); //删除L中第i个位置上元素
void PrintList(SqList *L); //输出L所有元素
void DestroyList(SqList *L); //释放L所占空间
int main() //测试函数是否可行
{
SqList *L; //指针较为方便
L = InitList();
int i;
for(i=0;i<55;i+=11)
{
ListInsert(L, 1, 99-i);
}
printf("当前表的长度为%d\n",Length(L));
PrintList(L);
ListDelete(L, 2);
PrintList(L);
int e = L->data[2];
printf("\n%d的位置是%d",e,LocateElem(L,e));
printf("\n第%d个元素为%d\n",2,GetElem(L,2));
DestroyList(L);
printf("当前表的长度为%d\n",Length(L));
PrintList(L);
return 0;
}
SqList* InitList() //返回指向SqList类型的指针
{
SqList *L;
L = (SqList *)(malloc(sizeof(SqList))); //申请空间并返回指针赋值
L->length = 0;
return L;
};
int Length(SqList *L)
{
return L->length;
}
int LocateElem(SqList *L, int e) //平均比较次数为(n+1)/2
{
int i;
for(i=0; i<L->length; i++)
{
if(L->data[i] == e)
return i+1;
}
return 0;
}
int GetElem(SqList *L, int i) //O(1)
{
return L->data[i-1];
}
bool ListInsert(SqList *L, int i, int e) //平均移动次数为n/2
{
int j;
if(i<1 || i>L->length+1){
printf("插入位置不合法\n");
return false;
}
if(L->length >= MaxSize){
printf("存储空间已满\n");
return false;
}
for(j=L->length; j>=i; j--)
{
L->data[j] = L->data[j-1]; //第i个元素及后面后移一个位置
}
L->data[i-1] = e;
L->length++;
printf("%d已被插入\n",e);
return true;
}
bool ListDelete(SqList *L, int i) //平均删除次数为(n-1)/2
{
int j;
if(i<1 || i>L->length){
printf("删除位置不合法\n");
return false;
}
printf("\n%d已被删除\n",L->data[i-1]);
for(j=i; j<=L->length; j++)
{
L->data[j-1] = L->data[j]; //第i+1个元素及后面前移一个位置
}
L->length--;
return true;
}
void PrintList(SqList *L)
{
int i;
printf("当前表中元素为 ");
for(i=0; i<L->length; i++)
printf("%d ",L->data[i]);
}
void DestroyList(SqList *L)
{
printf("表已清空\n");
L->length = 0;
free(L); //释放L所指空间内存
}