前言
本人在校大一学生,想把学过的数据结构总结一遍,此篇是我写的第一篇,我水平有限,文中如果有不正确的地方,希望大家可以指正出来,非常感谢!也希望能和同样学习计算机的同学们交流交流!
一、线性表的概念
线性表是n个类型相同的数据元素的有限序列,对n>0,除第一元素无直接前驱和最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和一个直接后继。元素之间具有一对一的关系。
在计算机中主要有两种基本的存储结构用于存放线性表:顺序存储结构和链式存储结构。今天我们主要介绍顺序存储结构实现线性表的存储。
二、顺序表的概念
采用顺序储存结构的线性表叫做顺序表。线性表的顺序储存是用一组地址连续的储存单元依次储存线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素储存在相邻的物理储存单元中即通过数据元素物理储存的相邻性来反映数据元素之间逻辑上的相邻关系。
三、顺序表表示
顺序表可用C语言中的一维数组来表示,一维数组的下标与元素在线性表中的序号相对应。
#define max 100//此处定义线性表的最大长度
typedef struct{
int data[max];
int last;//记录顺序表最后一个元素在数组中的位置 ,空表置为-1.
}list;
说明:
① 在这里我为了方便数据类型定义的是int型,可以根据实际需要来定义元素的数据类型。如char、float等等。
②从数组下标为0处存放线性表的第一个元素,即a[0]存放的是线性表的第一个元素,要尤其注意。
③有两种方式访问顺序表中的元素。
1、定义变量 list L,通过L.data[i-1]即可访问顺序表中序号为i的元素。
2、定义指针变量 list L,*L1,L1=&L。通过L1->data[i-1]即可访问顺序表中序号为i的元素。
四、顺序表的C语言实现
1、对顺序表进行初始化
//顺序表的初始化
void start(list l){
l.last=-1;
}
2、创建顺序表
/*n为元素的个数*/
void shunxu(list *l,int n){
int i=0;
int j;
while(i<n){
scanf("%d",&j);//输入元素
l->data[i]=j;
i++;
}
l->last =n;
}
3、 进行指定位置插入
/*在顺序表第i个元素之前插入元素e*/
void enterlist(list *l,int i,int e){
int k;
if((i<0)||i>l->last){
printf("插入的位置不合法\n");
}
if(l->last>max){
printf("表满,无法插入\n");
}
for(k=l->last;k>=i-1;k--){/*为插入元素移动位置*/
l->data[k+1]=l->data[k];
}
l->data[i-1]=e;
l->last++;
}
如果在第4个元素之前插入一个元素,则需将位置4到位置9的元素一次后移一个位置,然后将“21”插入位置4,如图所示:
4、对指定位置删除
/*在顺序表L中删除第i个数据元素*/
void dellist(list *l,int i){
int k,t;
t=l->last;
if(i<0||i>l->last){
printf("删除的位置不合法\n");
}
else{
printf("删除的元素是%d\n",l->data[i-1]);
for(k=i-1;i-1<=l->last;k++){
l->data[k]=l->data[k+1]; /*将后面的元素依次前移*/
}
}
l->last=t-1;
}
如果要删除第5个元素,则需将第6个元素到第10个元素依次向前移动一个位置 ,如图所示:
5、打印顺序表
void printlist(list l){
int i=0;
while(i<l.last){
printf("%d ",l.data[i]);
i++;
}
printf("\n");
}
总代码:
#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct{
int data[max];
int last;//记录顺序表最后一个元素在数组中的位置
}list;
//顺序表的初始化
void start(list l){
l.last=-1;
}
//对顺序表进行顺序插入
void shunxu(list *l,int n){
int i=0;
int j;
while(i<n){
scanf("%d",&j);
l->data[i]=j;
i++;
}
l->last =n;
}
//进行指定位置插入
void enterlist(list *l,int i,int e){
int k;
if((i<0)||i>l->last){
printf("插入的位置不合法\n");
}
if(l->last>max){
printf("表满,无法插入\n");
}
for(k=l->last;k>=i-1;k--){
l->data[k+1]=l->data[k];
}
l->data[i-1]=e;
l->last++;
}
//对指定位置删除
void dellist(list *l,int i){
int k,t;
t=l->last;
if(i<0||i>l->last){
printf("删除的位置不合法\n");
}
else{
printf("删除的元素是%d\n",l->data[i-1]);
for(k=i-1;i-1<=l->last;k++){
l->data[k]=l->data[k+1];
}
}
l->last=t-1;
}
//顺序表的打印
void printlist(list l){
int i=0;
while(i<l.last){
printf("%d ",l.data[i]);
i++;
}
printf("\n");
}
int main(){
list l;
int n,k,i,e;
while(1){
printf(" 顺序表表子系统 \n");
printf("***************************\n");
printf("* 1-------初始化 *\n");
printf("* 2-------建 表 *\n");
printf("* 3-------插 入 *\n");
printf("* 4-------删 除 *\n");
printf("* 5-------显 示 *\n");
printf("* 0-------退 出 *\n");
printf("***************************\n");
printf("请输入菜单(0-5): ");
scanf("%d",&k);
if(k==0){
break;
}
switch(k){
case 1:{
start(l);
printf("初始化成功!\n");
break;
}
case 2:{
printf("请输入元素的个数:");
scanf("%d",&n);
printf("请输入元素:");
shunxu(&l,n);
break;
}
case 3:{
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的值:");
scanf("%d",&e);
enterlist(&l,i,e);
break;
}
case 4:{
printf("请输入要删除的位置:");
scanf("%d",&i);
dellist(&l,i);
break;
}
case 5:{
printlist(l);
break;
}
case 0:{
break;
}
}
}
}