原创

线性表的顺序存储结构-顺序表(c语言版)

温馨提示:
本文最后更新于 2021年02月04日,已超过 1,416 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

什么是顺序存储?

借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

什么是线性表的顺序存储(顺序表)?

用一组地址连续的存储单元依次存储线性表的数据元素。

线性表(顺序存储)的基本操作

1.初始化
2.销毁
3.清空
4.取值
5.查找
6.插入
7.删除

定义结构体

typedef struct             //图书信息定义
{
    int no;         //图书编号 
    char name[50];        //图书名称 
    float price;         //图书价格 
}Book;
//定义一个顺序存储的线性表 
typedef struct
{
    Book *elem;            //存储空间的基地址 类似于一维数组a[n] 
    int length;            //图书表中图书的个数 
 }SqList;                //图书表的顺序存储结构类型为SqlList 
//初始化线性表

初始化线性表

//初始化线性表 
int InitList_Sq(SqList &L){
    L.elem = (Book *) malloc(MAXSIZE*sizeof(Book)); //分配内存空间 
    if(!L.elem) return -1;//内存溢出 
    L.length=0;              //初始化长度为0 
    return 0;
}

销毁线性表

//销毁线性表
void DestroyList(SqList &L){
    if(L.elem)
    free(L.elem);
}

清空线性表

//清空线性表
void ClearList(SqList &L){
    L.length=0;
}

向线性表中插入一个元素

//向线性表中插入一个元素 
int InsertList_Sq(SqList &L,int i,Book b){
    if(i<1&&i>L.length) return -1;//判断插入的位置是否存在
    if(L.length==MAXSIZE) return -1; //存储空间已满 
    for(int j=L.length-1;j>=i;j--){

        L.elem[j+1]=L.elem[j];    //将插入位置极其后面的元素都向后移动一个单位 
    }
    L.elem[i-1]=b;                //插入元素 
    ++L.length;                    //链表的长度+1 
    return 0;
}

获取线性表的长度

//获取线性表的长度 
int GetLength (SqList L){
    return (L.length);
}

获取线性表中指定位置的元素

//获取指定位置的元素 
int GetElem(SqList L,int i,Book &b){
    if(i<1&&i>L.length) return -1;//元素位置不合法
    b = L.elem[i-1]; 
    return 0;
}

删除线性表中指定位置的元素

//删除指定位置的元素 
int DeleteElem(SqList &L,int i){
    if(i<1&&i>L.length) return -1;//元素位置不合法
    for(int j=i;j<L.length-1;j++){
        L.elem[j-1]=L.elem[j];
    } 
    L.length--;
    return 0;
}

完整代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAXSIZE 10000 //图书表可能达到的最大长度
//为图书定义一个抽象数据类型 并起别名为Book 
typedef struct             //图书信息定义
{
    int no;         //图书编号 
    char name[50];        //图书名称 
    float price;         //图书价格 
}Book;
//定义一个顺序存储的链表 
typedef struct
{
    Book *elem;            //存储空间的基地址 类似于一维数组a[n] 
    int length;            //图书表中图书的个数 
 }SqList;                //图书表的顺序存储结构类型为SqlList 
//初始化线性表 
int InitList_Sq(SqList &L){
    L.elem = (Book *) malloc(MAXSIZE*sizeof(Book)); //分配内存空间 
    if(!L.elem) return -1;//内存溢出 
    L.length=0;              //初始化长度为0 
    return 0;
}
//销毁线性表
void DestroyList(SqList &L){
    if(L.elem)
    free(L.elem);
} 
//清空线性表
void ClearList(SqList &L){
    L.length=0;
} 
//获取线性表的长度 
int GetLength (SqList L){
    return (L.length);
}
//向线性表中插入一个元素 
int InsertList_Sq(SqList &L,int i,Book b){
    if(i<1&&i>L.length) return -1;//判断插入的位置是否存在
    if(L.length==MAXSIZE) return -1; //存储空间已满 
    for(int j=L.length-1;j>=i;j--){

        L.elem[j+1]=L.elem[j];    //将插入位置极其后面的元素都向后移动一个单位 
    }
    L.elem[i-1]=b;                //插入元素 
    ++L.length;                    //链表的长度+1 
    return 0;
} 
//获取指定位置的元素 
int GetElem(SqList L,int i,Book &b){
    if(i<1&&i>L.length) return -1;//元素位置不合法
    b = L.elem[i-1]; 
    return 0;
}
//查找指定元素的位置
int LocationElem(SqList L,Book b){
    for(int i=0;i<L.length;i++){
        if(L.elem[i].no==b.no) return i+1; //此处根据暂时根据价格来判断,实际可以根据图书编号 
        return 0;
    }
} 
//删除指定位置的元素 
int DeleteElem(SqList &L,int i){
    if(i<1&&i>L.length) return -1;//元素位置不合法
    for(int j=i;j<L.length-1;j++){
        L.elem[j-1]=L.elem[j];
    } 
    L.length--;
    return 0;
}
main(){
    SqList SL;
    //初始化链表 
    int a = InitList_Sq(SL);
    if(a==0){ //判断是否初始化成功 
    printf("初始化链表成功!\n");
    }else{
    printf("初始化链表失败!\n");    
    }
    //获取链表的长度 
    int b = GetLength(SL);
    printf("线性表的长度为: %d\n",b);

    Book book;//生成一个图书 
    book.no=2101;
    book.name[0]='b';
    book.name[1]='b';
    book.name[2]='q';
    book.price=58.8;
    //插入一个链表 
    int c = InsertList_Sq(SL,1,book); 
    if(c==0){ //判断是否插入成功 
    printf("插入成功!\n");
    }else{
    printf("插入失败!\n");    
    }
    int d = GetLength(SL);//获取链表的长度 
    printf("线性表的长度为: %d\n",d);
    //获取链表指定位置元素
    Book book1;
    int e = GetElem(SL,1,book1);
    if(e==0){
    printf("获取元素成功!图书名称为:");     
    }
    for(int i=0;i<3;i++){
        printf("%c",book1.name[i]);  
    }
    //查找指定元素的位置
    int f = LocationElem(SL,book);
    printf("\n元素位置为: %d\n",f);
    //删除指定位置的元素
    int g = DeleteElem(SL,1);
    if(g==0){
        printf("元素删除成功!\n");
    }else{
        printf("元素删除失败!\n");
    }
    //获取链表的长度 
    int h = GetLength(SL);
    printf("线性表的长度为: %d\n",h);
}

file

正文到此结束
本文目录