线性表的定义:线性表是由n(n>=0)个性质相同的数据元素组成的有限序列,n称为线性表的长度。对于非空线性表(k0,k1,……,kn-1),具有唯一一个“第一个结点”,即开始结点k0,它没有直接的前驱,仅有一个直接的后继k1;具有唯一一个“最后一个”结点,即终端结点kn-1,它没有直接的后继,仅有一个直接的前驱kn-2,其余内部结点ki都有且仅有一个直接的前驱和一个直接的后继。
线性表类型:顺序表和链表
顺序表
主要操作:
- SeqList SetNullList (int m) 创建一个空的线性表
- int IsNull(SeqList list) 判断线性表是否为空
- int InsertPre(SeqList list , position p , DataType x) 在线性表中第p个位置q前插入元素x
- int InsertPost(SeqList list , position p , DataType x) 在线性表中第p个位置后插入元素x
- int DelIndex(SeqList list , position p ) 删除线性表中第p个位置元素
- int DelValue(SeqList list , DataType x) 删除线性表中值为x的元素
- int FindIndex(SeqList list , DataType x) 在线性表中查找值为x元素的位置
顺序表数据类型的定义
typedef int DataType;
struct List
{
int Max;//最大可容元素的个数
int n;//记录元素的个数
DataType*elem;
};
typedef struct List*SeqList;
创建一个空的线性表
//代码实现
SeqList SetNullList (int m)
{
SeqList alist = (SeqList)malloc(sizeof(struct List));
if(alist!=NULL)
{
alist->elem = (DataType*)malloc(sizeof(DataType)*m);
if(alist->elem!=NULL)
{
alist->n = 0;
alist->Max = m;
return alist;
}
else free(alist);
}
printf("Alloc failure!\n");
return NULL;
}
判断线性表是否为空
int IsNull(SeqList list)
{
if (list->n == 0)
{
printf("is null!\n");
return 1;
}
else
{
printf("not null!\n");
return 0
}
}
在线性表中第p个位置q前插入元素x
//代码描述
int InsertPre(SeqList list , int p , DataType x)
{
int i;
if (list->n >= list->Max)//判断是否超出数组的容量
{
printf("overflow!\n");
return 0;
}
if (p<0 || p>list->n)
{
printf("not exit!\n");
return 0;
}
for (i = list->n; i >= p; i--)
{
list->elem[i + 1] = list->elem[i];
}
list->elem[p] = x;
list->n++;
return 1;
}
//int InsertPost(SeqList list , position p , DataType x)
//在线性表中第p个位置后插入元素x
//即为在p+1位置插入元素x与上面算法相同,只需要把p改成p+1即可
删除线性表中第p个位置元素
可以看作为元素的覆盖
//代码实现
int DelIndex(SeqList list, int p)
{
int i;
if (p > list->n||p < 0)//p位置不存在
{
printf("not exit!\n");
return 0;
}
for (i = p; i < list->n-1;i++)
{
list->elem[i] = list->elem[i + 1];
}
list->n--;
return 1;
}
在线性表中查找值为x元素的位置
int FindIndex(SeqList list, DataType x)
{
int i, p;
if (IsNull(list))//判断是否为空表
{
printf("not exit!\n");
return -1;
}
for (i = 0; i < list->n; i++)
{
if (list->elem[i] == x)break;
}
p = i;
return p;
}
删除线性表中值为x的元素
//代码实现
int DelValue(SeqList list, DataType x)
{
int p;
p=Find(list,x);
if (p == list->n||p == -1)
{
printf("not exit!\n");
return 0;
}
else
{
DelIndex(list, p);
return 1;
}
}