概念:由同类型数据元素沟成有序序列的线性结构。
抽象数据类型描述
类型名称:线性表(List)
数据对象集:n个元素构成的有序序列(a1,a2,a3,…,an)
操作:
- List MakeEmpty()–构造一个空的线性表
- ElementType FindKth(int k, List L)–查找k位置的元素
- int Find(ElementType X,List L)–查找元素X在线性表L中第一次出现的位置
- void Insert(ElementType X, int i, List L)–在i位置前插入元素X
- void Delete(int i, List L)–删除i位置的元素
- int Length(List L)–返回线性表L的长度
数组实现线性表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1024
typedef int ElementType;
typedef struct LNode* List;
struct LNode
{
ElementType Data[MAXSIZE]; //存放元素的数组
int last; //最后一个元素的索引
};
/**
* @brief 初始化,创建一个空链表
*
* @return List
*/
List MakeEmpty()
{
List Ptrl = (List)malloc(sizeof(struct LNode));
for (int i = 0; i < MAXSIZE; i++)
{
Ptrl->Data[i] = 0;
}
Ptrl->last = -1;
return Ptrl;
}
/**
* @brief 查找元素X在线性表的位置
*
* @param X
* @param L
* @return int
*/
int Find(ElementType X, List L)
{
for (int i = 0; i <= L->last; i++)
{
if (L->Data[i] == X)
{
return i;
}
}
return -1;
}
/**
* @brief 在索引i处插入元素x
*
* @param X
* @param i
* @param L
*/
void Insert(ElementType X, int i, List L)
{
if (i<0 || i>L->last+1)
{
printf("位置越界");
return;
}
/*
在i处插入新元素,则i处的原元素及后续元素均后移一位
*/
for (int j = L->last; j >= i; j--)
{
L->Data[j + 1] = L->Data[j];
}
L->Data[i] = X;
L->last++;
}
/**
* @brief 删除序列表L中索引i处的元素
*
* @param i
* @param L
*/
void Delete(int i, List L)
{
if (i<0 || i>L->last+1)
{
printf("索引越界");
return;
}
/*
删除索引i处的元素,则i+1处及其后面所有的元素均前移一位
*/
for (int j = i; j <= L->last - 1; j++)
{
L->Data[j] = L->Data[j + 1];
}
L->last--;
}
int main()
{
List list = MakeEmpty();
Insert(0, 0, list);
Insert(1, 1, list);
Insert(2, 2, list);
Insert(3, 3, list);
Insert(4, 4, list);
Insert(5, 5, list);
int index = Find(3, list);
Delete(2, list);
Insert(2, 2, list);
return 0;
}
链表实现线性表
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode* List;
struct LNode
{
ElementType Data;
List Next;
};
/*
* 求线性表元素的数量
*/
int lenth(List list)
{
int i = 0;
List temp = list;
while (temp)
{
temp = temp->Next;
i++;
}
return i;
}
/*
查找索引k位置的元素
*/
ElementType FindKth(int k, List list)
{
int index = 0;
List temp = list;
while (temp != NULL)
{
if (k > index)
{
temp = temp->Next;
index++;
}
else
{
break;
}
}
if (temp == NULL)
{
return NULL;
}
else
{
if (index == k)
{
return temp->Data;
}
else
{
return NULL;
}
}
}
List Find(int index, List L)
{
List p = L;
for (int i = 0; i < index; i++)
{
p = p->Next;
}
return p;
}
List Insert(ElementType X, int i, List L)
{
List p, s;
if (i == 0)
{
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = L;
return s;
}
p = Find(i-1, L);
if (p == NULL)
{
printf("参数越界");
return NULL;
}
else
{
//索引i-1的元素是p,
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return L;
}
return NULL;
}
List Delete(int i, List list)
{
List p, s;
if (i == 0)
{
s = list;
if (list != NULL)
{
list = list->Next;
}
else
{
return NULL;
}
free(s);
return list;
}
p = Find(i-1, list);
if (p == NULL)
{
return NULL;
}
else if (p->Next == NULL)
{
return NULL;
}
else
{
s = p->Next;
p->Next = s->Next;
free(s);
return list;
}
}
int main()
{
List list = Insert(0, 0, NULL);
Insert(1, 1, list);
Insert(2, 2, list);
Insert(3, 3, list);
Delete(2, list);
return 0;
}