顺序表
采用顺序存储结构的线性表称为顺序表,它的数据元素按照逻辑顺序依次存放在一组连续的存储单元中
逻辑上相邻的数据元素,其存储位置也彼此相邻
顺序表可采用结构体类型描述
结构体
A不涉及typedef的结构体
//结构体的定义(不涉及typedef)
struct Student
{
int a;
double b;
};
//和int y类似,定义了一个struct Student类型的变量
struct Student LiHua;
B使用typedef的结构体
//结构体定义框架(涉及typedef,typedef用来起别名)
//int char 数组 指针
typedef struct 名称1 //type define
{
属性1; //int a;
属性2; //char b;
}别名;
//举例:
typedef struct Student //大部分名称1可以省略,除了结构体内部有指向自己的指针
{
int a;
double b;
}xuesheng;
xuesheng LiHua;
//举例:大部分名称1可以省略,除了有指向自己的指针
typedef struct LNode
{
int data;
struct LNode*next;
}LNode;
LNode head; //定义一个LNode内型的变量
LNode *p; //定义一个LNode类型的指针
p=&head; //指针指向head
head.data=5; //通过变量取里面的值
p->data=4; //通过指针取里面的成员
教材中对线性表的定义
顺序表sqList
typedef int DataType;
typedef struct sqList //定义线性表的结构
{
DataType* sqList; //指向线性表的指针
int length; //表长(从1开始记数)
int maxLength; //表容量(从1开始记数)
}sqList;
构造顺序表利用一维数组存储元素,线性表长度经常变化,实际长度就是表长length,但是数组的长度是固定的,为了容纳顺序表,一维数组的长度应该足够大,最大长度maxLength,length的初始长度为0,也就是空表,最大长度不超过maxLength;
int length; //表长(从1开始)
int maxLength; //表容量(从1开始)
结构体中list指针指向元素存储空间,该空间是DataType类型的一维数组,长度为maxLength,这个空间需要在创建线性表的函数中动态创建,数组下标从0到maxLength-1;
DataType* List; //指向线性表的指针
DataType是某种数据类型的另一种表示,就是别名,可以作为整型,长整型,浮点型,字符串结构体或类等等的别名
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称
typedef int DataType;
DataType表示int类型,下面这两行代码完全等价
int a;
DataType a;
1.设计一个元素类型为整数的顺序表
#include<stdio.h>
#include<stdlib.h>
//将整数int重定义为DataType(重命名)
typedef int DataType;
//定义线性表的结构
typedef struct List
{
DataType* list; //指向线性表的指针
int length; //表长
int maxLength; //表容量
}ListType;
头文件<stdlib.h>的补充解释
#include<stdlib.h>
malloc函数,free函数也被包含在这个头文件中
2.创建一个新的线性表,参数是线性表的最大容量length,成功返回指向该表的指针,否则返回NULL
ListType* CreatList(int length)
//返回类型为ListType*的指针型变量,函数名称为CreatList,函数参数为int类型的length
{
ListType* sqList=(ListType*)malloc(sizeof(ListType)); //通过指针定义一个结构体
//创建ListType*的指针型变量sqList,并通过malloc函数为其分配内存空间,大小为ListType结构体的大小
if(sqList!=NULL) //检查内存是否分配成功,如果sqList不为NULL,则表示内存分配成功
{
sqList->list=(DataType*)malloc(sizeof(DataType)*length);
//为线性表的数据组list分配内存空间,大小为DataType类型的大小乘以length
if(sqList->list==NULL)
return NULL;
//如果内存分配失败,返回NULL
sqList->length=0;
//将线性表的长度初始化为0,此时线性表为空表
sqList->maxLength=length;
//将线性表的最大长度设置为传入参数length的值
}
return sqList;
//返回创建好的线性表的指针sqList
}
上面的代码片段,使用两次malloc函数是为了分配内存给线性表的结构和数据数组
第一个malloc函数调用用于分配线性表结构所需的内存空间,ListType是一个结构体类型,包含了线性表的相关信息,如长度,容量,通过调用malloc,我们可以在堆内存中动态分配足够的空间来存储该结构体
具体语法:
ListType* sqList=(ListType*)malloc(sizeof(ListType));
第二个malloc函数用于分配线性表中数据数组所需要的空间,数据数组的类型是DataType,length是数组的期望长度
具体语法:
sqList->list=(DataType*)malloc(sizeof(DataType)*length);
3.销毁线性表,参数是指向需要销毁的线性表的指针,不需要返回值
void DestroyList(ListType*pList)
{
free(pList->list);
}
4.置空线性表,参数是指向需要置空线性表的指针,不需要返回值
void ClearList(ListType*pList)
{
Plist->length=0;
}
5.检测线性表是否为空,参数是指向线性表的指针,如果线性表为空返回1;否则返回0
int IsEmptyList(ListType*pList)
{
return pList->length==0?1:0;
}
6.获取线性表的指针,参数是指向线性表的指针,返回线性表的长度
int GetListLength(ListType*pList)
{
return pList->length;
}
7.获取线性表中第n个元素,参数是指向线性表的指针pList,要获取元素在线性表中的位置,如果获取成功,将取得元素放进data中,获取成功返回1,失败返回0
int GetListElement(ListType*pList,int n,DataType* data)
{
if(n||n>pList->length-1) //验证n位置的有效性
return 0;
*data=pList->list[n]; //将指定位置的元素值赋值给data
return 1;
}
8.从pos起查找data第一次出现的位置,参数是指向线性表的指针pList,查找的起始位置pos,要查找的元素data,找到则返回该位置,未找到则返回-1
int FindElement(ListType*pList,int pos,DataType data)
{
for(int n=pos;n<pList->length;n++)
{
if(data==pList->list[n]) //查找指定元素
return n; //返回元素位置
}
return -1;
}
9.获取第n个元素的前驱,参数是指向元素的指针pList,n的前驱,获取成功,将元素存放于data中,找到则返回前趋的位置(n-1),未找到则返回-1
int GetPriorElement(ListType*pList,int n,DataType* data)
{
if(n<1||n>pList->length-1)
return -1;
*data=pList->list[n-1];
return n-1;
}
10.获取第n个元素的后继,参数是指向线性表的指针pList,n的后继,获取成功将元素存在data中,找到则返回后继位置(n+1);未找到则返回-1
int GetNextElement(ListType*pList,int n,DataType*data)
{
if(n<0||n>pList->length-2)
return -1;
*data=pList->list[n+1];
return n+1;
}
11.将data插入到线性表的pos位置处,参数是指向线性表的指针pList,插入的位置pos,要插入的元素存放在data中,成功则返回
int insertToList(ListType*pList,int pos,DataType data)
{
//如果插入的位置不正确或者线性表已满,则插入失败
if(pos<0||pos>pList->length||pList->length==pList->maxLength)
return -1;
//从pos开始,所有元素向后移动一位
for(int n=pList->length;n>pos;--n)
{
pList->list[n]=pList->list;
}
//插入新元素
pList->list[pos]=data;
//表长增加1
return ++pList->length;
}
12.将pos位置处的元素删除,参数是指向线性表的指针pList,删除元素的位置pos,成功则返回新的表长,失败返回-1
int DeleteFromList(ListType*pList,int pos)
{
判断插入位置的合法性
if(pos<0||pos>pList->length)
return -1;
将pos后的元素向前移动一个单位
for(int n=pos;n<pList->length-1;n++)
{
pList->list[n]=pList->list[n+1];
}
return --pList->length;
}
13.输出线性表,参数是指向线性表的指针
void PrintList(ListType*pList)
{
for(int n=0;n<pList->length;++n)
printf("第%d项:%d\n",n,pList->list[n]);
}