线性表的顺序存储结构-顺序表(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);
}
正文到此结束
- 本文标签: c语言 数据结构 线性表
- 本文链接: https://www.it1997.com/article/34
- 版权声明: 本文由小陈没烦恼原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权