数据结构之线性表(C语言)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*
定义一个结构体,包含
保存指向动态数组指针的指针域base,
动态数组的有效长度cent,
动态数组的总长度length
*/
struct Student
{
int* base;
int cent;
int length;
};
//函数的声明
void init_list(struct Student* str,int len);
bool append_list(struct Student* str,int val);
bool insert_list(struct Student* str,int pos,int val);
bool delete_list(struct Student* str,int pos,int* val);
void show_list(struct Student* str);

int main() {
struct Student str; //定义结构体变量str
int val;
init_list(&str,6); //调用init_list函数,给str中的变量赋值
append_list(&str,10); //为动态数组添加元素
append_list(&str,20);
append_list(&str,30);
append_list(&str,40);
append_list(&str,50);
// append_list(&str,60);
// append_list(&str,70);
printf("线性表:");
show_list(&str); //遍历线性表
putchar(‘\n‘);
if(insert_list(&str,2,5)) //判断插入元素是否成功,插入成功则输出线性表,否则输出插入失败的原因
{
printf("插入元素后的线性表:");
show_list(&str);
}
putchar(‘\n‘);
if(delete_list(&str,2,&val)) //判断删除元素是否成功,删除成功则输出删除元素和线性表,否则输出删除失败的原因
{
printf("删除的元素:%d\n",val);
printf("删除元素后的线性表:");
show_list(&str);
}
putchar(‘\n‘);
return 0;
}

/*
传入结构体变量的地址和动态数组的长度,
初始化结构体变量str,
str的有效长度赋值为0,str的总长度赋值为len,
str的base指向malloc动态分配的数组
*/
void init_list(struct Student* str,int len)
{
str->base=(int*)malloc(sizeof(int)*len); //动态分配数组
if(str->base==NULL) //判断内存是否分配成功,失败则退出
{
printf("内存分配失败!\n");
exit(-1);
}
str->cent=0;
str->length=len;
}

/*
传入结构体变量的地址和追加的值,
将val赋值给数组中下标为cent的位置,
然后cent++
*/
bool append_list(struct Student* str,int val)
{
if(str->cent>=str->length) //判断动态数组中有效长度是否与总长度相等,如果相等,则返回false
{
printf("动态数组空间不足!\n");
return false;
}
str->base[str->cent]=val; //将val追加给数组
str->cent++; //结构体中cent+1
return true;
}

/*
传入结构体变量的地址,
用for循环遍历动态数组
*/
void show_list(struct Student* str)
{
if(str->cent<=0) //判断数组是否为空,如果为空,则不用执行for循环,直接return
{
printf("动态数组为空!\n");
return;
}
for(int i=0;i<str->cent;i++) //用for循环遍历动态数组
{
printf("%d\t",str->base[i]);
}
putchar(‘\n‘);
return;
}

/*
传入结构体变量的地址、插入的位置和插入的值,
先找到插入的位置pos,将pos后的元素都后退一次,
将val赋值给数组下标为pos-1的位置
然后cent++
*/
bool insert_list(struct Student* str,int pos,int val)
{
if(str->cent>=str->length) //判断数组是否已满,如果已满,则返回false
{
printf("动态数组已满!\n");
return false;
}
if(pos<1||pos>str->cent) //判断插入的位置是否合适,如果不合适,则返回false
{
printf("插入位置不合适!\n");
return false;
}
for(int i=str->cent-1;i>=pos-1;i--) //利用for循环,将下表为pos-1后的元素都后移一个位置
{
str->base[i+1]=str->base[i];
}
str->base[pos-1]=val; //将val的值赋值给下标为pos-1的位置
str->cent++;
return true;
}

/*
传入结构体变量的地址、需要删除的位置和val的地址,
先找到需要删除的位置pos,将下标为pos-1的值赋值给*val,
然后将pos后的元素都前进一次,
最后cent--
*/
bool delete_list(struct Student* str,int pos,int* val)
{
if(str->cent<=0) //判断数组是否为空,如果为空,则直接返回false
{
printf("动态数组为空!\n");
return false;
}
if(pos<1||pos>str->cent) //判断删除的位置是否合适,如果不合适,则返回false
{
printf("删除的元素的位置不存在!\n");
return false;
}
*val=str->base[pos-1]; //将下标为pos-1的值存放在*val中
for(int i=pos;i<str->cent;i++) //用for循环,将下标为pos-1后的元素都前进一次
{
str->base[i-1]=str->base[i];
}
str->cent--;
return true;
}

时间: 2024-10-13 12:20:27

数据结构之线性表(C语言)的相关文章

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

自学数据结构——顺序线性表2

1 /* 2 ============================================================================ 3 Name : sqlist.c 4 Author : codecup 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ==================================

数据结构:线性表插入一次删除一次的代码

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cstdio> using namespace std; int insertsqlist(int weizhi,double charu,int *t,double b[]){   

数据结构:线性表之单链表

线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储结构: ①顺序存储结构,即存储单元在一段连续的地址上存储,常见的数组就是顺序存储结构的线性表: ②链式存储结构,即存储单元在不连续的地址上存储.因为其不连续性,除了要存数据元素信息(数据域)外,还要存储它后继元素(结点)的地址(指针域,链).学习链式结构最好将结点结构牢记于心,如下图: 链表的每个结点只含有一个指

数据结构之线性表

线性表是最简单最常用的一种数据结构,在生活中各个方面都有应用. 线性表的定义:线性表大多数情况下是除了第一个位置的数据元素只存在后继元素,最后一个位置的数据元素只存在前驱元素外,所有数据元素都存在前驱和后继的一个有限序列.举个简单的例子就是:字母表中除了 a 只存在后继 b,z 只存在前驱 y之外,剩余的所有字母全部都有前驱和后继.为什么是大多数情况下,是因为线性表的链式存储结构中除了单向链表,还有循环链表和双向链表. 线性表的存储结构:顺序存储(数组实现,需要预先分配连续的内存空间)和链式存储

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i