0 前言
线性表(亦作顺序表)是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
1 结构
2 特征
3 结构特点
4 顺序存储
顺序存储就是采用一段连续的内存单元依次存储线性表的数据元素,顺序存储的线性表也称为顺序表,在顺序存储的方式中,逻辑上相邻的两个数据元素在物理位置上也是相等的,如表所示:
顺序表可以使用一维数组表示,其表示如下
<span style="font-size:14px;">#define MAXSIZE 100
DataType data[MAXSIZE];
int length</span>
其中MAXSIZE决定了顺序表的最大内存空间,length为当前数据元素的个数,也就是顺序表元素的长度,length应小于或等于MAXSIZE,顺序表中的数据元素从data[0]开始一次存储,因此最后一个元素的下标为length-1.我们也可以将data和length进行封装,即定义一个结构体作为顺序表的类型,定义如下
<span style="font-size:14px;">typedef struct node
{
DataType data[MAXSIZE];
int length;
}sqlList;</span>
这样我们就可以用sqlList来定义顺序存储的线性表了。
接下来我们写一个程序实现创建并初始化一个顺序表,然后将各个数据元素输出到屏幕。实现代码如下:
<span style="font-size:14px;">/*
* =====================================================================================
*
* Filename: sqlList.c
*
* Description:
*
* Version: 1.0
* Created: 2014年08月23日
* Revision: none
* Compiler: gcc
*
* Author: xinyi61
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 100
typedef struct node
{
int data[MAXSIZE];
int length;
}sqlList;
void initSqlList(sqlList *p, int n)
{
int i;
if(n > MAXSIZE)
{
printf("\033[47;31m error !\033[0m");
return ;
}
srand((unsigned)time(NULL));
for(i = 0; i < n; ++i)
{
p->data[i] = rand()%100;
}
p->length = n;
}
int main(int argc, char *argv[])
{
sqlList sl;
int i;
int n;
printf("\033[42;35m please input a number less than %4d\033[0m",MAXSIZE);
scanf("%4d",&n);
initSqlList(&sl,n);
printf("\033[44;32mElement (1 ~~%2d) is:\n\033[0m",sl.length);
for(i = 0; i < sl.length; ++i)
{
printf("%4d",sl.data[i]);
}
printf("\n");
return 0;
}</span>
实验结果如下:
至此,我们对顺序表的创建有了相当的掌握了。接下来看看顺序表的一些操作。
5 插入数据元素
在线性表的第i个位置插入一个新的数据元素,将会使原来编号为i,i+1,i+2,...,n的数据元素变为编号为i+1,i+2,i+3,...,n+i,顺序表的插入前后如图所示:
插入的代码实现是:
<span style="font-size:14px;">void insertSqlList(sqlList *p, int n, int x)
{
int *p1, *p2;
if(n < 1 || n > p->length)
{
printf("\033[47;31m insert position error !\033[0m");
return ;
}
if(p->length >= MAXSIZE)
{
printf("\033[47;31mno enough space to insert an element\033[0m");
return ;
}
p1 = &(p->data[n]);
p2 = &(p->data[p->length]);
for(; p1 <= p2; --p2)
{
*p2 = *(p2 -1);
}
*p1 = x;
++p->length;
}</span>
实验结果是:
6 删除数据元素
删除顺序表的第i个元素, 将会使原来编号为i+1,i+2,i+3,...,n+i的数据元素变为编号为i,i+1,i+2,...,n,顺序表的删除前后如图所示:
删除的代码实现为:
<span style="font-size:14px;">void deletSqlList(sqlList *p, int n, int *x)
{
int *p1, *p2;
if(n < 1 || n >= p->length)
{
printf("\033[47;31m delet position error !\033[0m");
return ;
}
p1 = &(p->data[n]);
p2 = &(p->data[p->length]);
*x = *p1;
for(; p1 < p2; ++p1)
{
*p1 = *(p1 + 1);
}
--p->length;
}</span>
实验结果为:
至此关于线性表的顺序存储及简单实现就介绍完了,感兴趣的读者可以尝试其他方法实现。
备注1:
在最开始的代码中我使用了srand()、和rand()函数来实现随机数的产生,这里将解析下这两个函数的具体使用。
原型为:int rand(void);
例如随机输出0~100的整数
#include<stdlib.h>/*用到了srand函数,所以要有这个头文件*/
#include<stdio.h>
#define MAX 10
int main(int argc, char *argv[])
{
int number[MAX]={0};
int i;
unsigned int seed;
scanf("%d",&seed);/*手动输入种子*/
srand(seed);
for(i = 0;i < MAX; ++i)
{
number[i]=rand()%100;/*产生100以内的随机整数*/
printf("%d",number[i]);
}
printf("\n");
return0;
}
或者是
#include <stdlib.h>
#include <stdio.h>
#include <time.h>/*用到了time函数,所以要有这个头文件*/
#define MAX 10
int main(int argc, char *argv[])
{
int number[MAX]={0};
int i;
srand((unsigned)time(NULL));/*播种子*/
for(i = 0;i < MAX; ++i)
{
number[i]=rand()%100;/*产生100以内的随机整数*/
printf("%d",number[i]);
}
printf("\n");
return 0;
}