张小五学算法与数据结构第三天:线性表的顺序存储结构

本文介绍了线性表这一基本数据结构,包括其定义、顺序存储结构的特点及优缺点,并提供了使用C语言实现的顺序表基本操作代码示例。

今天是元气满满的第三天,外面下了很大的雪,估计明天没法去自习室啦,所以今天只是简单的写一下今天学习的内容,大部分会留到明天写一个上下出来。

一、线性表是什么?
线性表作为一种基本数据结构类型,在计算机存储中的映像(或表示)一般有两种形式,一种是顺序映像,一种是链式映像。
线性表的顺序存储结构的含义是将线性表L=(a0,a1,.....,an-1)中的各元素依次存储于计算机一片连续的存储空间。这种结构表示为线性表的顺序存储结构。
二、顺序表的特点
逻辑上相邻的两个元素,其存储位置也是相邻的;
对数据元素ai的存取为随机存取和按地址存取;
存储密度高。存储密度D约等于1;
但是顺序表需要一片连续的内存空间有时需要满足要求的空间可能比较少,并且它对表的插入和删除等运算的时间复杂度较差。
三、顺序表的基本运算
在这里我只写出建空表,置空表,插入元素和打印表元素的代码,其他代码类似,只需要稍加改动即可。
头文件sqlist.h:
#ifndef SQLIST_H_
#define SQLIST_H_

#define maxsize 1024 //线性表的最大长度
typedef struct{      //表的类型
    int data[maxsize]; //表的存储空间
    int last;
}sqlist, *sqlink;  //表说明符

void CreateList(sqlink L); //建空表
void ClearList(sqlink L);  //置空表
int GetList(sqlink L, int num); //根据序号取表元素
int LengthList(sqlink L);//求表长
int InsertList(sqlink L,int data,int num);//插入元素
int DeleteList(sqlink L,int num);//删除元素
int LocateList(sqlink L,int data);//定位元素
int EmptyList(sqlist L);//判空表;
void PrintList(sqlink L);//打印表元素
#endif // SQLIST_H_
sqlist.c:

#include "sqlist.h"

//建空表
void CreateList(sqlink L){
    int tempNo=1;
    int tempData=0;
    do{
        printf("请输入顺序表第%d个元素(输入-1结束): ",tempNo);
        scanf("%d",&tempData);
        if(tempData!=-1){
            L->data[tempNo-1]=tempData;
            L->last=tempNo-1;
            tempNo++;
        }
    }while(tempNo<maxsize&&tempData!=-1);
}
//求表长
int LengthList(sqlink L){
    int s;
    s = L->last;
    s = s+1;
    return s;
}
//打印表元素
void PrintList(sqlink L){
    printf("打印出的的线性表为:\n");
    int i;
    for(i=0;i<LengthList(L);i++){
        printf("%d ",L->data[i]);
    }
    printf("\n");
}
//插入元素
int InsertList(sqlink L,int data,int num){
    int j;
    if(L->last>maxsize-1){
         printf("该线性表已经没有空间了!\n");
         return -1;
    }else if(num< 0 || num>L->last+1){
             printf("您输入的位置有误!\n");
             return -1;
    }else{
                for(j=L->last;j>=num;j--){
                    L->data[j+1] = L->data[j];
                }
                L->data[num] = data;
                L->last++;
                return 0;
    }

}

//置空表
void ClearList(sqlink L){
    char in ='n';
    printf("你是否要置空表?Y:是,N:否");
    scanf("%c",&in);
    if(in=='y'||in=='Y'){
        L->last = -1;
        PrintList(L);
        }else if(in=='n'||in=='N'){
            PrintList(L);
            }else{
                printf("请输入正确的字母!");
                ClearList(L);
    }
}
主函数 main.c:
#include "sqlist.h"
#include "sqlist.c"
int main(int argc,char *argv[]){
    sqlink L=(sqlink)malloc(sizeof(sqlist));
    CreateList(L);
    PrintList(L);
    int data,x,y;
    printf("请输入需要插入的数据和位置:\n");
    scanf("%d %d",&data,&x);
    //InsertList(L,data,x-1);
    y = InsertList(L,data,x-1);
    if(y==0){
        printf("新表为:\n");
        PrintList(L);
    }else{
        PrintList(L);
    }
    return 0;
}

运行结果为:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小五丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值