1.线性表定义
1.1 线性表
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
1.2 顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
注意:这里的顺序表就相当于一个加强版的数组。
2.线性表的存储结构
#define MAXSIZE 100
typedef int ElemType; //元素类型
typedef struct {
ElemType *data; //线性表元素
int length; //线性表当前长度
int listsize; //线性表大小
}List;
3.初始化一个线性表
int InitList(List *L)
{
L->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType)); //给数据申请存储空间
if(!(L->data))
exit(0);
L->length=0;
L->listsize=MAXSIZE;
return 1;
}
4.创建一个线性表
void CreatList(List *L) //创建一个线性表
{
int i;
printf("输入数字个数:\n");
scanf("%d",&L->length); //输入该表的大小
printf("输入数字:\n");
for(i=0;i<L->length;i++) //输入线性表中各值
scanf("%d",&L->data[i]);
}
5.删除一个线性表的某一个值
void Delete(List *L)
{
int i,j,k,*p,len;
p=L->data;
len=L->length;
for(i=1;i<len;i++) //遍历查找
{
if(*p==L->data[i]) //找到要删除的数
L->length--;
else //没有就继续遍历
{
p++;
*p=L->data[i];
}
}
}
6.将线性表逆置
void Inversion(List *L)
{
int i,a;
for(i=0;i<L->length/2;i++) //左右两边边调换位置
{
a = L->data[i];
L->data[i] = L->data[L->length-i-1];
L->data[L->length-i-1] = a;
}
}
7.打印线性表的值
void Print(List *L)
{
int i;
if(L->length==0)
{
printf("顺序表为空!");
return ;
}
else
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
8.全部代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType *data;
int length;
int listsize;
}List;
int InitList(List *L)
{
L->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!(L->data))
exit(0);
L->length=0;
L->listsize=MAXSIZE;
return 1;
}
void CreatList(List *L)
{
int i;
printf("输入数字个数:\n");
scanf("%d",&L->length);
printf("输入数字:\n");
for(i=0;i<L->length;i++)
scanf("%d",&L->data[i]);
}
void Delete(List *L)
{
int i,j,k,*p,len;
p=L->data;
len=L->length;
for(i=1;i<len;i++)
{
if(*p==L->data[i])
L->length--;
else
{
p++;
*p=L->data[i];
}
}
}
void Inversion(List *L)
{
int i,a;
for(i=0;i<L->length/2;i++)
{
a = L->data[i];
L->data[i] = L->data[L->length-i-1];
L->data[L->length-i-1] = a;
}
}
void Print(List *L)
{
int i;
if(L->length==0)
{
printf("顺序表为空!");
return ;
}
else
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
int main()
{
List *L;
L = (List*) malloc(sizeof(List));
InitList(L);
CreatList(L);
getchar();
Print(L);
Delete(L);
printf("删除值相同值顺序表:");
Print(L);
getchar();
Inversion(L);
printf("逆置:");
Print(L);
getchar();
getchar();
return 0;
}