一、线性表的定义
线性表是一种最常用也是最简单的数据结构。简单来讲,一个线性表是n个数据元素的有限排列,在不同情况下,每个数据元素有着不同的含义。
二、线性表的组成
一个线性表的结构体由三部分组成:1.线性表中的元素(Elem)2.线性表的当前长度(Length)3、线性表当前分配的储存空间大小(ListSize,通常情况下ListSize>Length)
三、头文件以及数据的定义
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
使用typedef与define是为了提高程序的可读性。
四、线性表的具体操作
1.结构体创建
typedef struct
{
ElemType *elem; //线性表的基地址
int length; //线性表的当前长度
int listsize; //线性表当前储存空间大小
}SqList;
2.构建新线性表
第一步:使用malloc函数为线性表动态分配内存空间,由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。
Status InitList(SqList *L)
{
L->length = 0;
L->listsize = LIST_INIT_SIZE;
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem)
{
printf("储存空间分配失败\n");
exit(OVERFLOW);
}
printf("一个空的线性表已经构建成功\n");
return OK;
}
3.对线性表进行赋值
对线性表的大小进行赋值,如果超过原来的大小,则使用realloc函数重新分配大小。
Status ValueList(SqList *L)
{
int i,j;
printf("请输入线性表元素的个数: ");
scanf("%d",&i);
if(i > L->listsize)
{
while(1)
{
if(i > L->listsize)
{
L->elem = (ElemType *)realloc(L->elem,LISTINCREMENT * sizeof(ElemType));
L->listsize += LISTINCREMENT;
}
else break;
}
}
for(j = 0; j < i;j++)
{
printf("请输入第%d个元素: ",j+1);
scanf("%d",&L->elem[j]);
}
L->length = i;
printf("赋值成功\n");
return OK;
}
4.销毁线性表
Status ClearList_Sq(SqList *L)
{
if(L->elem)
{
L->length = 0;
printf("线性表已重置\n");
return OK;
}
else
printf("线性表不存在,无法重置\n");
return OK;
}
5.向线性表中插入元素
插入的原理是确认插入位置后,将插入位置上及之后的元素向后移动一位。在这里,定义指针q,并将指针q赋值为当前插入位置的元素。利用for循环,向后移动元素,最后还要将数组长度扩大一位。
Status ListInsert(SqList *L)
{
int i;
int e;
ElemType *newbase;
int *q,*p;
printf("请输入插入的位置: ");
scanf(" %d",&i);
if(i < 1 || i > L->length+1)
{
printf("error\n");
return ERROR;
}
if(!newbase)
{
printf("储存空间分配失败\n");
exit(OVERFLOW);
}
printf("请输入插入的元素 ");
scanf(" %d",&e);
if(L->length >= L->listsize)
{
newbase = (ElemType * )realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(ElemType));
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
q = &(L->elem[i-1]);
for(p = &(L->elem[L->length - 1]);p >= q;--p)
*(p+1) = *p;
*q = e;
++L->length;
return OK;
}
6.删除元素
与插入元素的原理类似
Status DeleteList(SqList *L)
{
int i;
printf("请输入删除元素的位置");
scanf(" %d",&i);
if(i < 1 || i > L->length)
{
printf("error\n");
return ERROR;
}
int *p,*q;
p = &(L->elem[L->length-1]);
for(q = &(L->elem[i-1]);q < p;q++)
*q = *(q+1);
--L->length;
return OK;
}
7.打印线性表中的元素
Status PrintList(SqList *L)
{
printf("线性表的长度是%d\n",L->length);
printf("当前的元素是 ");
for(int k = 0;k<L->length;k++)
{
printf("\t%d\t",L->elem[k]);
}
printf("\n");
return OK;
}
如有需要改进的地方,请各位大佬在评论区留言,谢谢大家。