线性表
定义:由同类型数据元素构成有序序列的线性结构
- 表中元素个数为线性表的长度
- 线性表没有元素时,称为空表
- 表起始位置称为表头,结束位置称为表尾
抽象数据类型表述
类型名称:List
对象集:n(n>=0)个元素构成的有序序列
操作集:
List MakeEmpty(); //初始化一个空线性表L
ElementType FindKTh (int K, List L); //根据位序K,返回相应元素
int Find (ElementType X, List L); //在线性表L中查找X第一次出现的位置
void Insert (ElementType X, int I, List L); //在位序I前插入一个新元素X
void Delete (int i, List L); //删除指定位序i的元素
int Length (List L); //返回线性表长度
线性表的顺序存储
利用数组
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
typedef struct LNode *List;
struct LNode L;
List PtrL:
主要操作实现
初始化 (建立空的顺序表)
List MakeEmpty()
{
List PtrL;
PtrL = (List)malloc( sizeof (struct LNode ) );
PtrL->Last = -1;
return PtrL;
}
查找
int Find (ElementType X, List PtrL)
{
int i = 0;
while ( i <= PtrL->Last && PtrL->Data[i]!=X){
//i小于长度且i序号的数据非查找数据时i迭代
i++;
}
if (i > PtrL->Last){
return -1; //如果未找到,返回-1
}
else{
return i;
}
}
插入
void insert(ElementType X, int i, List PtrL)
{
int j;
if (PtrL->Last == MAXSIZE-1){
printf("数据溢出,无法插入");
return;
}
if(i<1 || i>PtrL->Last+2){
printf("插入位置非法");
}
for (j = Ptrl->Last; j>=i=1; j--){
PtrL->Data[j+1] = PtrL->Data[j];
PtrL->Data[i-1] = X;
PtrL->Last++;
return;
}
}
删除
void Delete(int i, List PtrL)
{
int j;
if(i<1 || i>PtrL->Last+1){
printf("删除位置非法");
return;
}
for(j = i; j <= PtrL->Last; j++){
PtrL->Data[j-1] = PtrL->Data[j];
PtrL->Last--;
}
return;
}
线性表的链式存储
利用链表
typedef struct LNode *List;
struct LNode{
ElementType Data;
List Next;
};
struct LNode L;
List PtrL;
主要操作实现
求表长
int Length(List PtrL)
{
List p = Ptrl;
int j = 0;
while(p){
p = p->Next;
j++;
}
return j;
}
查找
- 按序号查找
List FindKth(int K,List PtrL)
{
List p = PtrL;
int i = 1;
while (p != NULL && i < K){
p = p->Next;
i++;
}
if(i==K){
return p;
}
else{
return NULL;
}
}
- 按值查找
List Find(ElementType X, List PtrL)
{
List p = PtrL;
while(p != NULL && p->Data != X){
p = p->Next;
}
return p;
}
插入
List Insert(ElementType X, int i, List PtrL)
{
List p,s;
if(i == 1){
s = (List)malloc (sizeof (struct LNode));
s->Data = X;
s->Next = PtrL;
return s;
}
//插在表头要作为单独的情况列出来
p = FindKth(i-1,PtrL); //找到第i-1个结点
if(p == NULL){
printf(“无法插入”);
return NULL;
}
else{
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
删除
List Delete(int i, List PtrL)
{
List p,s;
if(i == 1){
s = PtrL;
if(PtrL != NULL){
PtrL = PtrL->Next;
}
}
else{
return NULL;
}
free(s);
return PtrL;
p = FindKth(i-1,PtrL);
if(p == NULL){
printf("结点不存在");
return NULL;
}
else if(p->Next == NULL){
printf("结点不存在");
return NULL;
}
else{
s = p->Next;
p->Next = s->Next;
free(s);
return PtrL;
}
}
双链表
内容待补充