【无标题】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

数据结构01——————线性表

1.线性表的概念

—线性表是最基本、最简单、也是最常用的一种数据结构。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。

我们说"线性"和"非线性",只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的"线性表",可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

提示:以下是本篇文章正文内容,下面案例可供参考

一.线性表使用步骤
(1):定义线性表结构
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType *elem; //存储空间的基址
int length; //当前线性表的长度
int listsize; //当前线性表的存储容量
}SqList;
(2):建立一个空的线性表
Status InitList_Sq(SqList &L){
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //L.elem为首元素的地址
if(!L.elem){ //如果存储空间分配失败,L.elem为NULL
printf(“存储空间分配失败\n”);
exit(OVERFLOW);
}
L.length = 0; //当前线性表为空表,即线性表长度为0
L.listsize = LIST_INIT_SIZE; //给线性表分配初始容量
printf(“一个空的线性表已经构建成功\n”); //输出空线性表构建成功的提示消息
return OK;
}
(3):对线性表进行赋值
Status ValueList_Sq(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 ListInsert_Sq(SqList &L,int i,ElemType e){
ElemType *newbase;
int *q,*p;
if(i < 1 || i > L.length+1) //判断插入位置的index值是否合法
return ERROR;
if(L.length >= L.listsize){ //如果当前线性表存储空间已满,增加分配
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) { //如果存储空间分配失败,则执行异常退出
printf(“存储空间分配失败\n”);
exit(OVERFLOW);
}
L.elem = newbase; //新的存储空间基址
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i-1]); //L.elem[index-1]为数组中的最后一个元素,q为要插入的位置
for(p = &(L.elem[L.length - 1]);p >= q;–p)
*(p+1) = *p; //要插入位置以及之后的位置向后移
*q = e; //将e插入到想要插入的位置
++L.length; //插入新的元素之后表长加1
printf(“元素插入成功\n”);
return OK;
}

(5):获取线性表某一位置对应的元素
Status GetElem_Sq(SqList L,int index){
int Num;
if(index <= 0 || index > L.length){ //如果要获取元素的位置是否出界
printf(“请输入一个有效的数字\n”);
return ERROR;
}
else
Num = L.elem[index - 1];
printf(“第%d个位置的元素为:%d\n”,index,Num);
return OK;
}
(6):打印线性表
Status PrintList_Sq(SqList L){
printf(“当前线性表的元素为:”);
for(int K = 0;K < L.length;K++) //遍历当前线性表
printf(" %d",L.elem[K]);
printf(“\n”); //换行
return OK;
}
(7):删除线性表某一位置的元素
Status DeleteList_Sq(SqList &L,int i){
int *p,*q;
if(i < 1 || i > L.length){ //如果要删除的位置不合法
printf(“请输入一个有效数字\n”);
return ERROR;
}
p = &(L.elem[i - 1]); //p为被删除元素的位置
q = L.elem + L.length - 1; //将表尾元素的位置赋值给q
for(++p;p <= q;p++)
*(p - 1) = *p; //被删除的元素之后的元素全部左移
–L.length; //表长减1
printf(“第%d个元素删除成功\n”,i);
return OK;
}

最后是所有的代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>

//函数结果状态代码
#define TRUE 1 //代码中出现TRUE相当于出现了1
#define FALSE 0 //出现FALSE相当于出现了0
#define OK 1 //出现OK相当于出现了1
#define ERROR 0 //出现ERROR相当于出现了0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量

typedef struct{
ElemType *elem; //存储空间的基址
int length; //当前线性表的长度
int listsize; //当前线性表的存储容量
}SqList;

//构造一个空的线性表
Status InitList_Sq(SqList &L){
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //L.elem为首元素的地址
if(!L.elem){ //如果存储空间分配失败,L.elem为NULL
printf(“存储空间分配失败\n”);
exit(OVERFLOW);
}
L.length = 0; //当前线性表为空表,即线性表长度为0
L.listsize = LIST_INIT_SIZE; //给线性表分配初始容量
printf(“一个空的线性表已经构建成功\n”); //输出空线性表构建成功的提示消息
return OK;
}

//对线性表进行赋值
Status ValueList_Sq(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;
/*realloc()函数:重新分配空间
参数:原空间基址,现需空间大小
返回:1.成功:新空间地址(本质上是一个数值)
2.失败:Null
*/
}
else
break;
}
}
for(j = 0;j < i;j++){
printf(“请输入第%d个元素:”,j + 1);
scanf(“%d”,&L.elem[j]);
}
L.length = i; //赋值完成后,修改并保存线性表的长度
printf(“赋值成功\n”);
return OK;
}

//判断线性表是否为空
Status ListEmpty_Sq(SqList L){
if(L.elem){ //判断线性表是否为空的前提是线性表存在,当首元素地址即L.elem存在时说明线性表存在
if(L.length != 0){ //如果线性表中元素为0,即L.length的值为0时说明线性表是空表
printf(“线性表不是空表\n”);
return FALSE;
}
else
printf(“线性表是空表\n”);
return TRUE;
}
else
printf(“线性表不存在,无法判断\n”);
return OK;
}

//获取线性表某一位置对应的元素
Status GetElem_Sq(SqList L,int index){
int Num;
if(index <= 0 || index > L.length){ //如果要获取元素的位置是否出界
printf(“请输入一个有效的数字\n”);
return ERROR;
}
else
Num = L.elem[index - 1];
printf(“第%d个位置的元素为:%d\n”,index,Num);
return OK;
}

//在线性表某一位置插入元素
Status ListInsert_Sq(SqList &L,int i,ElemType e){
ElemType *newbase;
int *q,*p;
if(i < 1 || i > L.length+1) //判断插入位置的index值是否合法
return ERROR;
if(L.length >= L.listsize){ //如果当前线性表存储空间已满,增加分配
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) { //如果存储空间分配失败,则执行异常退出
printf(“存储空间分配失败\n”);
exit(OVERFLOW);
}
L.elem = newbase; //新的存储空间基址
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i-1]); //L.elem[index-1]为数组中的最后一个元素,q为要插入的位置
for(p = &(L.elem[L.length - 1]);p >= q;–p)
*(p+1) = *p; //要插入位置以及之后的位置向后移
*q = e; //将e插入到想要插入的位置
++L.length; //插入新的元素之后表长加1
printf(“元素插入成功\n”);
return OK;
}

//打印线性表
Status PrintList_Sq(SqList L){
printf(“当前线性表的元素为:”);
for(int K = 0;K < L.length;K++) //遍历当前线性表
printf(" %d",L.elem[K]);
printf(“\n”); //换行
return OK;
}

//删除线性表某一位置的元素
Status DeleteList_Sq(SqList &L,int i){
int *p,*q;
if(i < 1 || i > L.length){ //如果要删除的位置不合法
printf(“请输入一个有效数字\n”);
return ERROR;
}
p = &(L.elem[i - 1]); //p为被删除元素的位置
q = L.elem + L.length - 1; //将表尾元素的位置赋值给q
for(++p;p <= q;p++)
*(p - 1) = *p; //被删除的元素之后的元素全部左移
–L.length; //表长减1
printf(“第%d个元素删除成功\n”,i);
return OK;
}
//清空线性表
void clearList(SqListPtr L) {
L->Length = 0;
return;
}

int main(){
SetConsoleTitle(“Dream_飞翔”);
SqList L;
int choose,index,e;
while(1){
printf(“\n");
printf(“* \n");
printf("
线性表的顺序表示和实现: \n");
printf("
\n");
printf("
1. 构造一个空的线性表 \n");
printf("
2. 对线性表进行赋值 \n");
printf("
3. 获取线性表某一位置对应的元素 \n");
printf("
4 在线性表某一位置插入元素 \n");
printf("
5 删除线性表某一位置的元素 \n");
printf("
6. 打印线性表 \n");
printf("
7 退出 \n");
printf("
*\n”);
printf("
\n”);
printf(“请做出您的选择:”);
scanf(“%d”,&choose);
switch(choose){
case 1:InitList_Sq(L);break;
case 2:ValueList_Sq(L);break;
case3{
printf(“请输入要获取元素的位置:”);
scanf(“%d”,&index);
GetElem_Sq(L,index);
}
break;
case 4:{
printf(“请输入要插入元素的位置:”);
scanf(“%d”,&index);
printf(“请输入要插入的元素:”);
scanf(“%d”,&e);
ListInsert_Sq(L,index,e);
}
break;
case 5{
printf(“请输入要删除元素的位置:”);
scanf(“%d”,&index);
DeleteList_Sq(L,index);
}
break;
case 6PrintList_Sq(L);break;
case 7:exit(0);
}
}
return 0;
}

三:赋值运算
(1):建构一个空的线性表,再赋值
请添加图片描述
插入元素,并打印线性表
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值