一、线性表的类型定义
1、线性结构的特点:在数据元素的非空有限集合中,
(1)存在唯一的一个“第一个”或“最后一个”数据元素;
(2)除第一个元素外,每个数据元素只有一个前驱;
(3)除最后一个元素外,每个数据元素只有一个后继;
2、线性表中的元素是多种多样的,但同一线性表中的元素必定有相同的特性,相邻数据元素之间存在序偶关系。
3、线性表长度与数组长度的区别:
(1)线性表长度是指线性表中数据元素的个数,随着线性表的插入和删除操作,这个量是变化的;
(2)数组长度是指存放线性表的存储空间的长度,在存储分配后这个量一般是不会改变的;
(3)线性表的长度 ≤ 数组长度
易错点:1、顺序表具有随机存储特性,指的是查找序号为i的元素与顺序表中元素个数n无关;
2、在长度为n的单链表中,删除尾节点的时间复杂度是O(n);
二、线性表顺序存储结构的基本操作
#include<stdio.h>
#include<stdlib.h>
#define maxsize 1024
typedef struct
{
int data[maxsize];
int length;
}sqlist;
/*初始化构造一个空表L*/
/*当length=0时表示表为空*/
int InitList(sqlist *L)
{
memset(L->data,0,sizeof(L));//初始化数据为0
L->length=0; //初始化长度为0
return 0;
}
/*销毁线性表L*/
/*当length=0时线性表为空*/
int DestroyList(sqlist *L)
{
L->length=0;
}
/*将线性表重置为空表*/
int ClearList(sqlist *L)
{
while(!L->data)
free(L->data)
L->length=0;
return 0;
}
/*判断线性表是否为空表*/
/*若L为空表,则返回ture[1],否则返回false[0]*/
int ListEmpty(sqlist L)
{
int i;
i=ListLength(L);
if(i==0)
return 0;
return 1;
}
/*返回中数据元素的个数*/
int ListLength(sqlist L)
{
return L.length;
}
/*返回L中第i个数据元素的值*/
int GetElem(sqlist L,int i)
{
/*条件判断是否在范围内,i从1开始,没有第0个的说法*/
if(i<1 || L.length==0 || i>L.length)
return -1;
else
return L.data[i-1];
}
/*查找线性表中是否存在某个值*/
int LocateElem(sqlist L,int e)
{
int i;
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
return i+1;
}
return -1;
}
/*寻找某个非第一个元素的前驱*/
int PriorElem(sqlist L,int e)
{
int i;
if(L.lenght==0)
return 0;
for(i=1;i<L.length;i++)
{
if(L.data[i]==e)
return L.data[i-1];
}
return -1;
}
/*寻找某个非最后一个元素的后继*/
int NextElem(sqlist L,int e)
{
int i;
if(L.length==0)
return 0;
for(i=0;i<L.length-1;i++)
{
if(L.data[i]==e)
return L.data[i+1];
}
return -1;
}
/*在第i个位置前插入元素e*/
int InsertElem(sqlist *L,int i,int e)
{
if(L->length>=Maxsize || i<1 || i>L->length+1)
return 0;
int k;
for(k=L->length-1;k>=i-1;k--)
{
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;//插入元素
L->length++;//表长增加1;
return 1;
/*删除指定位置的元素*/
int DeletElem(sqlist *L,int i)
{
if(i>L->length || i<1 || L->length==0)//不在删除范围内
return 0;
int k;
for(k=i-1;k<L->length-1;k++)
{
L->data[k]=L->data[k+1];
}
L->length--;
return 1;