系列文章目录
第一话 数据结构之线性表
文章目录
- 一、了解什么是线性表
- 二、线性表的特征
- 三、线性表的基本操作步骤
- 1、存储结构
- 2、基本操作
- 3、实现运用
- 四、总结
前言
出门乘作地铁或公交,从起点到终点,相当于一个线性表,其中整个线路上的每一个站点构成了线性表上的每一个数据元素。线性表也是最自由的,其表上任意位置的数据元素都可以操作。
一、什么是线性表?
线性表是最简单、最常用的线性结构,有两端,一个是首端,另一个是尾端,除了首尾,数据元素“一个接一个地排列”,并且元素的类型是相同的。
二、线性表的特征
1.有序性
线性表中相邻数据元素之间存在之序偶关系<ai,ai+1>。
2.有穷性
线性表由有限个数据元素组成,表长就是表中数据元素的个数。
3.同一性
线性表由相同类型构成,每一个ai必须属于同一数据类型。
三、线性表的基本操作步骤
如下:
1、定义存储结构--顺序存储
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
typedef int Elemtype;//定义一个整型的数据类型
typedef struct{
Elemtype date[maxsize];//一、存放数据为数组类型
int Len;//二\定义长度
}List;
//结构的名称为List
2、将线性表初始化
List *init_list()
{
List *L;//创造一个表
L = (List*)malloc(sizeof(List));//为表申请一块空间
L->Len = 0;//表最开始的长度为0
return L;
}
3、将线性表输入数据
void createlist(List *L)
{
Elemtype x;//要输入的数
int i=0;
printf("请输入线性表的数据,输入-1代表结束:\n");
scanf("%d",&x);
while(x!=-1){
L->date[i] = x;//将输入的数据放入表中
i++;
L->Len++;//将表的长度增加一格
scanf("%d",&x);
}
}
4、 将线性表数据输出
void outlist(List *L)
{
int i;
for(i=0;i<L->Len;i++){
printf("%5d",L->date[i]);//将表中的数据输出来
}
printf("\n");
}
5、在主函数中实现调用
int main(void)
{
List *L;
L = init_list();
createlist(L);
outlist(L);
return 0;
}
6、将线性表插入数据
void Insert(List *L,int i,Elemtype x)
{
int j;
for(j=L->Len;j>=i-1;j--){
L->date[j] = L->date[j-1];//将数据从前往后挪一位
}
L->date[i-1] = x;//将数据插入第i个位置
L->Len++;//插入之后长度得加1
}
int main(void)
{
List *L;
L = init_list();
createlist(L);
outlist(L);
Insert(L,2,10);//在第二个位置插入数据10
outlist(L);
return 0;
}
7、将线性表删除数据
void Delete(List *L,int i)
{
int j;
for(j=i;j<L->Len;j++){
L->date[j-1] = L->date[j];//让线性表数据都往前挪一位
}
L->Len--;
}
int main(void)
{
List *L;
L = init_list();
createlist(L);
outlist(L);
Delete(L,3);//将线性表第三个元素删除
outlist(L);
return 0;
}
四、总结
顺序存储表可以随机存取表中的任一元素,其存储位置可以用一个简单的、直观的公式表示。
另一方面,这个特点也造成了这种存储结构的缺点:在表中插入和删除操作时,需要移动大量元素。由于顺序要求占用连续的存储空间,存储分配只能预先静态分配,当表中数据元素个数较多且变化较大时,操作过程相对复杂,必然导致存储空间的浪费。
对于以上问题,是否有另一种存储结构可以解决呢?