——请先看图5秒以维持良好心情
一介绍
二步骤
1.头文件
#include <stdio.h>
#include <stdlib.h>
2.枚举线性表的状态与定义线性表的类型
enum Status{
success,fail,fatal,range_error
};//枚举线性表的状态(后期有用,主要为了方便理解程序)
//定义线性表的类型
typedef int ElemType;
3.建立线性表的结构声明
//声明线性表的大小
#define LIST_INIT_SIZE 100
typedef struct
{
//结构的主体,线性表内容的存储;
ElemType *elem;
//线性表已被占用的空间大小
int length;
//线性表的总空间大小
int list_size;
}SqList, *Ptr, *SqListPtr;//建立线性表的结构
4.函数声明
Status List_Init(SqListPtr L);
void List_Destory(SqListPtr L);
void List_Clear(SqListPtr L);
bool List_Empty(SqListPtr L);
int List_Size(SqListPtr L);
Status List_Retrival(SqListPtr L, int pos, ElemType *elem);
Status List_Locate(SqListPtr L, ElemType elem, int *pos);
Status List_Insert(SqListPtr L, int pos,ElemType elem);
Status List_delete(SqListPtr L, int pos);
Status List_Prior(SqListPtr L, int pos, ElemType *elem);
Status List_Next(SqListPtr L, int pos, ElemType *elem);
Status List_Print(SqListPtr L);
5.主体
int main()
{
//定义一个名称为“list”的线性表
SqList list;
//初始化线性表的储存状态
list.length = 0;
printf("创建线性表输入1\n");
printf("删除线性表中数据输入2\n");
printf("销毁线性表输入3\n");
while(1){
int opt;
//选择对线性表的操作
scanf("%d",&opt);
switch(opt)
{
case 1:{//读入数据
int i;
int size;
int d;//输入将存储的数据大小
scanf("%d",&size);
//建立临时的数组储存数据
int *a=(int*)malloc(sizeof(int)*size);
for(i=0;i<size;i++)
{
//输入数据
scanf("%d",&d);
a[i]=d;
}
//将临时存储数据的数组和线性表“list”的结构的地址输出到编号18函数中;
Test_CreateList(&list, a,size);
free(a);释放临时函数占据的内存空间;
}break;
//删除操作
case 2:{
//判断线性表“list”是否为空,如果为空则先进行读入数据的操作;
if(List_Empty(&list)){
printf("不存在,请输入数组\n");
int i;
int size;
int d;
scanf("%d",&size);
int *a=(int*)malloc(sizeof(int)*size);
for(i=0;i<size;i++)
{
scanf("%d",&d);
a[i]=d;
}
Test_CreateList(&list, a,size);
free(a);
}
int pos;
//输入待删除的数据在表中的位置
scanf("%d",&pos);
//将待删除的数据在表中的位置和线性表的地址输出到186行的函数中;
List_delete(&list, pos);
List_Print(&list);//输出线性表的数据,查看操作结构;
}break;
default:{
s=0;
if(!List_Empty(&list)){//判断如果线性表不为空,销毁线性表;
List_Destory(&list);
}
printf("结束");};
}
}
return 0;
}
6.为线性表分配存储空间
Status List_Init(SqListPtr L)
{
Status s=fail;//先将其操作状态定义为失败
if(L != NULL)//判断线性表是否存在
{
L->elem = ( ElemType* )malloc(LIST_INIT_SIZE*sizeof(ElemType));//为线性表分配LIST_INIT_SIZE个单位的空间;
{
L->list_size = LIST_INIT_SIZE;//申明线性表的总空间大小;
L->length = 0;初始化线性被使用的空间;
s = success;将操作状态变为成功;
}
}
return s;
}
7.线性表扩大总存储空间,与可变数组类似
void List_Add(SqListPtr L,int nums){
SqListPtr news;
news->elem = ( ElemType* )malloc(nums*10*sizeof(ElemType));
for(int i=0;i<L->length ;i++){
news->elem [i]=L->elem [i];
}
free(L->elem );
L->elem = news->elem ;
}
8.销毁线性表
void List_Destory(SqListPtr L)
{
if (L)
{
if (L->elem)
{
free(L->elem);//释放线性表占据的空间
L->elem = NULL;//指针置为空
L->length = 0;
}
}
}
9.使线性表的使用空间变为0
void List_Clear(SqListPtr L){
if(L)
{
L->length = 0;
}
}
10.判断线性表的储存状态
bool List_Empty(SqListPtr L)
{
return (L->length == 0);
}
11.(为了方便理解所设置的函数)读出该位置数据
Status List_Retrival(SqListPtr L, int pos, ElemType *elem)
{
//使操作状态定义为失败
Status s = range_error;
if(L)
{
if( pos >=0 && pos< L->length)
{
*elem = L->elem[pos];
//使操作状态变为成功;
s = success;
}
}
return s;
}
12.搜索数据的位置
Status List_Locate(SqListPtr L, ElemType elem, int *pos)
{
Status s = range_error;
int i = 0;
if (L)
{
//遍历表中的数组(元素)
for (i = 0; i < L->length; i++)
{
if (L->elem[i]==elem)//比较
{
*pos = i;
s = success;
break;
}
}
}
return s;
}
13.线性表插入操作
Status List_Insert(SqListPtr L, int pos,ElemType elem)
{
Status s = range_error;
int i;
if (L)
{
//使线性表被使用空间加一
L->length++;
//判断该位置是否存在
if(pos <= L->length)
{
int nums=L->length /10 + 1;
List_Add( L, nums);
}
if(pos>=0 && pos < L->length)//
{
if (L->length < L-> list_size)
{
for( i=L->length-1;i>=pos;i--){
L->elem[i+1]=L->elem[i];
}
L->elem[pos]=elem;
s= success;
}
}
}
return s;
}
14.删除某一位置的数据
Status List_delete(SqListPtr L, int pos){
Status s=range_error;
int i;
if(L){
//判断位置是否被使用
if(pos>=0&&pos<L->length){
//判断存储空间是否不足
if (L->length < L-> list_size){
//将该位置之后一个的数据覆盖此位置的数据,并将往后的数据依次前移
for(i=pos;i<L->length-1;i++){
L->elem[i]=L->elem[i+1];
}
//占用空间数目减一
L->length--;
s=success;
}
}
}
return s;
}
15.求某一位置的后驱数据(元素)
Status List_Prior(SqListPtr L, int pos, ElemType *elem)
{
Status s;
//判断线性表是否存在
if(L){
//判断该位置的存储空间是否被使用
if(pos > 0 && pos < L->length){
*elem = L->elem[pos - 1];
s =success;
}
}
return s;
}
16.求某一位置的后驱数据(元素)
Status List_Next(SqListPtr L, int pos, ElemType *elem)
{
Status s;
//判断线性表是否存在
if(L){
//判断该位置的存储空间是否被使用
if(pos >= 0 && pos < L->length){
*elem = L->elem[pos + 1];
s =success;
}
}
return s;
}
17.打印线性表的数据
void List_Print(SqListPtr L)
{
int i;
if(L){
for(i=0;i<L->length;i++){
printf("%d ",L->elem[i]);
if((i+1) %10 == 0){
printf("\n");
}
}
}
}
18.将输入的临时数组输入到线性表中
Status Test_CreateList(SqListPtr list,ElemType data[],int n)
{
Status s = fail;
int i;
s = List_Init(list);
if (s == success)
{
//遍历数组的每个数据元素并依次输入到线性表中
for(i=0; i<n;i++)
{
s = List_Insert(list, i, data[i]);
if (s!=success){
break;
}
}
List_Print(list);
}
return s;
}
19.清除线性表的所有数据
Status Test_ClearList(SqListPtr list)
{
Status s = fail;
if(!List_Empty(list))
{
List_Clear(list);
if(List_Empty(list)){
s = success;
}
}
return s;
}
20.输出某一位置的数据(元素)和其前(后)驱的数据(元素)
Status Test_RetrivalPriorNext(SqListPtr list,int pos){
Status s = range_error;
ElemType e;
s = List_Retrival(list, pos, &e);
if (s == success)
{
printf("%d的元素是%d\n",pos,&e);
s=List_Prior(list,pos,&e);
if(s==success){
printf("%d的直接前驱元素%d\n",pos,e);
}
else{
printf("没有直接前驱\n");
}
s=List_Next(list, pos, &e);
if(s==success){
printf("%d的直接后继元素是%d\n", pos, e);
}else{
printf("没有直接后继\n");
}
}else{
printf("位置不合法\n");
}
return s;
}
21.寻找某一数据位置
Status Test_Locate(SqListPtr list,ElemType e)
{
Status s;
int pos;
s=List_Locate(list, e, &pos);
if (s==success)
{
printf("%d的位置是%d\n",e,pos);
}
else{
printf("无法找到");
}
return s;
}
22.输出线性表的长度
int List_Size(SqListPtr L)//(为了方便理解所设置的函数)
{
return L->length;
}
void Test_Size(SqListPtr list)
{
int len;
len = List_Size(list);
printf("线性表的长度%d\n",len);
}
总结
这里没有将所有操作在主函数中写出,但是列出了所需要的函数,
看到这里你应该心有所感了吧,自己试试实现剩余操作,检验学习成果。