之前对与数据结构与算法的一些抽象型类型进行了简单的解析,接下来我们进入具体数学模型的学习。
线性表:一个具有相同性质的数据元素的有限的序列;关键字:相同性质、有限、有序;
线性表的特点:处于中间的数据元素唯一只有一个直接前驱和直接后继,具有一个起始结点和终端结点;
回顾我们之前解析的抽象数据类型((从具体数据元素抽象出具有共同的逻辑结构)+操作),那么线性就是我们从学生表、图书表抽象出来的一个逻辑结构称为线性表;
数据结构包含:逻辑结构+存储结构+算法;
线性表在计算机的主要常见的存储方式有两种:顺序存储+链式存储;
一:顺序存储介绍:
由于线性表中的数据元素存放具有一下特性:
A.地址连续
B.依次存放
C.随机存取
D.性质相同
我们很容易想到使用C语言中的一维数组来存放数据元素,利用函数来实现操作。
//基于C语言编译环境实现线性表顺序存储的代码,举例:我们要存储一些图书信息
#include <stdio.h>
//malloc函数使用需要引入下面的库函数
#include <stdlib.h>
//定义一个宏变量
#define MAX 10
//创建一个自定义的结构体
typedef struct list{
char bookname[30];
char booknumber[30];
char bookcopyright[30];
struct list *arr;
}Book;
//创建一个自定义的结构体也可以称为线性表类型
struct book{
//创建一个结构体指针,使用一定要进行初始化,否则为野指针,系统会报错
Book *arr;
//length代表有几本图书
int length;
};
//初始化一个线性表
int main(){
//进行arr指针的初始化
struct book L;
L.length = 0;
printf("请输入要输入基本图书信息,范围为1-10:\n");
scanf("%d", &L.length);
while (L.length > 10){
printf("抱歉您输入的数据错误,不在规定的范围之内,请重新输入:\n");
scanf("%d", &L.length);
}
printf("系统为您创建了%d个空间存放图书信息\n", L.length);
int i = 0;
int a = 0;
//创建指针一定要初始化
Book* p = (Book*)malloc(sizeof(Book));
L.arr = (Book*)malloc(sizeof(Book));
L.arr->arr = (Book*)malloc(sizeof(Book));
L.arr->arr->arr = (Book*)malloc(sizeof(Book));
L.arr->arr->arr->arr = (Book*)malloc(sizeof(Book));
L.arr->arr->arr->arr->arr = (Book*)malloc(sizeof(Book));
L.arr->arr->arr->arr->arr->arr = (Book*)malloc(sizeof(Book));
p = L.arr;
for (i; i < L.length; i++)
{
scanf("%s", &p->bookname);
scanf("%s", &p->booknumber);
scanf("%s", &p->bookcopyright);
p = p->arr;
}
int j = 0;
for (j; j < L.length;j++)
{
printf("%s\n", L.arr->bookname);
printf("%s\n", L.arr->booknumber);
printf("%s\n", L.arr->bookcopyright);
printf("\n");
L.arr = L.arr->arr;
}
}
二:我们成功实现线性表的顺序存储后,我们开始一些操作;
简单的操作:
1.初始化,Initlist(&L):构造一个空的线性表L;
2.删除,Destroylist(&L):销毁一个线性表L;
3.重置,Clearlist(&L):清除一个线性表L;
4.求表长度,Lengthlist(L):求一个线性表达长度及返回元素个数;
5.判断表是否为空,ListEmpty(L):空返回FLASE,反之,TURE;
复杂的操作:
1.插入一个数据元素,Insertlist(&L,e);
2.删除一个数据元素,Delectlist(&L,e);
//C语言实现表的一些操作
#include <stdio.h>
//初始化的操作
void Initlist(int arr[10]){
for (int a; a < 10; a++){
scanf("%d", &arr[a]);
}
for (int i = 0; i < 10; i++){
printf("%d ", arr[i]);
}
}
//销毁的操作
void Destory(int arr[10]){
//free(p)释放指针
free(arr[10]);
}
int main(){
int arr[10];
//初始化
Initlist(arr[10]);
//销毁
Destroylist(arr[10]);
}
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int arr[10];
for (int c=0; c < 10; c++){
scanf("%d", &arr[c]);
}
for (int i = 0; i < 10; i++){
printf("%d ", arr[i]);
}
printf("请输入要插入的数字:\n");
scanf("%d", &a);
printf("请输入要插入的位置:\n");
scanf("%d", &b);
int j = 10 - b;
for (j; j >= 0; j--){
arr[j + 1] = arr[j];
}
arr[b-1] = a;
for (int m = 0; m < 10; m++){
printf("%d ", arr[m]);
}
}
以上展示部分代码,剩余代码思路一样。
以上就是数据结构与算法 第二章,线性表的顺序存储的实现与展示。