线性表的定义
线性表是由n个类型相同数据元素组成的有限长序列。
线性表性质
(1)在线性表中元素之间相对位置是确定的,且数据元素之间关系由表中的位置决定。
(2)即使两个线性表有相同的数据元素,若数据元素的顺序不同两个线性表也不相等。
线性表与数组的区别
(1)线性表是一种抽象的数据类型,表中每一个数据元素除了最前数据元素和最后数据元素,其它数据元素都存在唯一的前驱和后继数据元素,数组是一种具体的数据类型。
(2)从逻辑上看,数组中的每一个数据都与它的下标呈一一映射的关系,而线性表的数据元素之间具有一对一的线性关系。
(3)数组可以看作是线性表的实现。
顺序表的定义
线性表的顺序存储结构是指用一组连续的储存单元依次存储线性表中的每个数据元素。
顺序表的C语言实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
//线性表初始化
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE]; /* data */
int length;
}SqList;
typedef enum //枚举类型
{
ERROR = 0,
OK = 1
} Status;
// 用a返回线性表s的第i个元素(第i-1位置)的值
Status GetElem(SqList s, int i, ElemType *a)
{
Status flag;
if((s.length == 0)||(i < 1)||(i>s.length))//表为空或不在查找范围内
flag = ERROR;
else
{
*a = s.data[i - 1];//将线性表第i个元素的值赋给a
flag = OK;
}
return flag;
}
//在线性表s的第i个位置插入元素a
Status ListInsert(SqList *s, int i, ElemType a)
{
int j;
Status flag;
if(s->length == MAXSIZE||(i < 1)||(i> s->length + 1))//表已满
flag = ERROR;
else
{
for (j = s->length-1;j >= i-1;j--)
{
s->data[j + 1] = s->data[j];//要插入元素的位置以后的元素依次后移一位
}
s->data[i - 1] = a;
s->length++;//长度加一
flag = OK;
}
}
//删除表s的第i个元素,用a表示删除的值
Status ListDelete(SqList *s, int i, ElemType *a)
{
int j;
Status flag;
if (s->length == 0 || (i < 1) || (i > s->length)) //表已空
flag = ERROR;
else
{
*a = s->data[i - 1];//将被删除的值赋给a
for (j = i - 1; j < s->length;j++)
{
s->data[j] = s->data[j + 1];//要删除元素以后的每一个值都向前移动一位
}
s->length--;//长度减一
flag = OK;
}
return flag;
}
//打印表s所有的数据
void ListDisplay(SqList *s)
{
int i;
printf("SqList is:");
for (i = 0; i < s->length; i++)
{
printf("%d", s->data[i]);//将线性表内的元素按顺序一一打印
}
printf("\n");
}
void main()
{
SqList test;
test.length = 0;
ListDisplay(&test);
int i;
for (i = 0;i < 10;i++)
{
ListInsert(&test, i, i * 2);
printf("insert data %d, now", i * 2);
ListDisplay(&test);
}
int data = 0;
GetElem(test, 5, &data);
printf("SqList test fifth data is %d\n", data);
printf("SqList test fifth data is %d\n", test.data[4]);
int len = test.length;
for (i = 0; i < len;i++)
{
int b;
ListDelete(&test, 1, &b);
printf("delete data %d,now", b);
ListDisplay(&test);
}
}