首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言实现线性表

线性表是最简单数据结构之一, 一个线性表是n个具有相同特性数据元素有限序列。...线性表中数据元素之间关系是一对一关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接(注意,这句话只适用大部分线性表,而不是全部。...比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素尾指针指向了首位结点)。...#define LISTINCREMENT 10 //线性表存储空间分配增量(当存储空间不够时要用到,暂时未使用`1) typedef int listElemType; typedef struct...(sqList.c文件): // // Created by tioncico on 19-4-24. // #include "sqList.h" /**  * 初始化线性表  * @param

1K20

线性表】之栈(C语言)

---- 栈 栈也是线性表,在逻辑上还是挨着放。 栈概念以及结构 栈:一种特殊线性表,其只允许在固定一端进行插入和删除元素操作。**进行数据插入和删除操作一端称为栈顶,另一端称为栈底。...**栈中数据元素遵守后进先出LIFO(Last In First Out)原则。 压栈:栈插入操作叫做进栈/压栈/栈, 数据在栈顶。 出栈:栈删除操作叫做出栈。 出数据也在栈顶。...(顺序表——【线性表】之顺序表_半生瓜のblog-CSDN博客) 链表实现 出数据得找到前一个,这样的话用双向链表更好一些。...如果用单链表实现,就用头去做栈顶,这样栈和出栈效率都是O(1)。 ​ 整体来说数组效率更优一些。...StackDestory(Stack* ps) { assert(ps); free(ps->arry); ps->arry = NULL; ps->top = ps->capacity =0 ; }

66410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    线性表】之队列(C语言)

    队列概念 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作特殊线性表,队列具有先进先出FIFO(First in First Out)。 入队列:进行插入操作一端称为队尾。...出队列:进行删除操作一端称为队头。 同样可以使用链表或者数组 数组:不是适合,队头出数据需要挪动数据。 链表:适合单链表,单链表头删效率很高。...QueueNode* curNext = cur->next; free(cur); cur = curNext; } pq->head = pq->tail = NULL; } 队尾...pq->tail = newnode; } } 队头出 void QueuePop(Queue* pq) { assert(pq); assert(pq->head);//队列是不等于空...QueueNode* curNext = cur->next; free(cur); cur = curNext; } pq->head = pq->tail = NULL; } //队尾

    52210

    线性表】之顺序表(C语言)

    线性表】之顺序表 线性表 线性表(linear list)是n个具有相同特性元素有限序列 。...线性表是一种在实际中广泛使用数据结构,常见线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续一条直线。...但是在物理结构上并不一定是连续线性表在物理上存储时,通常以数组和链式结构形式存储。 顺序表 它是最简单数据结构,也是最常用数据结构——他作用就是将数据存起来。...概念:顺序表是用一段物理地址连续存储单元依次存储数据元素线性结构,一般情况下采用数组存储。在数组上完成数据增删改。 顺序表一般可分为: 1.静态顺序表:使用定长数据存储。...4 : ps->capacity * 2; //realloc扩充原来开辟好空间 //如果原来空间在原来地方是空,那就他是直接申请一个新空间就跟malloc是一样

    62410

    C语言线性表(实现线性表里面的函数)

    /************************************************************************/ /* 线性表(linear list) 线性表是一个相当灵活数据结构...,它长度可以根据需要增长和缩短,即对线性表数据元素不仅可以进行访问,还可以进行插入和删除等。...抽象定义线性表如下: ADT:Abstract Data Type 抽象数据类型 ADT LIST L:LIST简称,即线性表本身 i:索引 e:element简称,即元素 cur_:current...:从链表中指定位置删除元素 ListTraverse(L, visit()) 遍历数组 :遍历元素 简单线性表--C语言实现 线性表组成类型:int数组*/ /*************...:获取线性表中指定元素 { if(i = 0)//索引必须大于或者等于0,因为索引是从零开始

    55130

    C语言坑指南-数组之谜

    前言 在C语言中,数组和指针似乎总是“暧昧不清”,有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。 数组回顾 在分析之前,我们不妨回顾一下数组知识。...但C99中引入了变长数组,允许数组维度是表达式 ,但在数组分配内存时,其表达式值可以被求出。...数组和指针不相等 考虑下面的声明: int c[4];//假设int占4字节 int *d; 对于上面的声明,编译器会给c预留内存空间4*4字节,并且数组名代表着指向数组第一个元素指针。...所以此时有下面的操作: c[3]; //合法 *(c+3); //合法 *d; //不合法,d指向了内存中不确定位置 c++; //不合法,一维数组名是指针常量...,常量不能被修改掉 d++; //可通过编译 另外,下面的两种情况也是不一样: char c[] = "hello"; char *d = "hello"; 前者对字符数组a进行了初始化

    77030

    线性表】—动态顺序表增删改实现

    即在数组上完成数据增删改。 采用数组存储原因是,数组地址也是连续,随着下标的增长而增长。其实在我们之前写通讯录,本质其实就是一个顺序表。...但是这里需要注意是,当顺序表为空时候,是不能进行删除!...头插时候切记注意检查扩容情况!...还有就是,这个pos必须是在数组有效范围内,不能跑到别的地方插入数据,因为顺序表地址是连续,如果超过了这个范围,就不构成连续了,如下: 代码实现: //在pos位置插入 void SeqListInsert...不过这里有一点需要注意是,任意位置插入与删除,如果这个位置是下标为0地方,这就等同于头插头删,如果这个pos是在下标为size处,这就是尾插尾删 所以我们头插可以也写为: //头插 void

    46040

    线性表之顺序表(C语言实现)

    一、线性表 线性表(linear list)是n个具有相同特性数据元素有限序列。...线性表是一种在实际中广泛使用数据结构,常见线性表:顺序表、链表、栈、队列、字符串等… 线性表在逻辑上是线性结构,也就说是连续一条直线。...但是在物理结构上并不一定是连续线性表在物理上存储时,通常以数组和链式结构形式存储....二、顺序表 概念: 顺序表是用一段物理地址连续存储单元依次存储数据元素线性结构,一般情况下采用数组存储。在数组上完成数据增删改。...顺序表一般分为;两种:1.静态顺序表 2.动态顺序表 静态顺序表实际作用不大,本篇主要讲解动态顺序表. 2.1 静态顺序表简单介绍: 静态顺表是指顺序表容量是固定,如果看过c语言实现通讯录友友们

    87830

    动态顺序表增删改(C语言实现)

    动态顺序表 准备工作 检查,扩容 头插头删,尾插尾删 顺序表查找 顺序表打印 在指定位置插入和删除x 完整版顺序表 准备工作 我们还是分一个头文件和两个源文件 sequence.h sequence.c...test.c sequence.h #include typedef struct Sequence_List { int* p;//顺序表初始地址 int count;...//元素数量 int capacity;//容量 }SL;//顺序表动态储存 sequence.c void Initialize(SL* s)//初始化顺序表 { assert(s);//判断s...s->capacity = i;//容量增加 } } 头插头删,尾插尾删 sequence.c 尾插: void SeqListPushBack(SL* s, SLData x)//尾插,x是你要插入元素...x void SeqListErase(SL* s, size_t pos);//删除pos位置元素 sequence.c #include "sequence.h"; void Initialize

    60100

    C语言坑指南-缓冲区溢出

    前言 缓冲区溢出通常指的是向缓冲区写入了超过缓冲区所能保存最大数据量数据。.../buff terminated 已放弃 (核心已转储) 可以看到,由于p所指向字符串长度大于buff长度,拷贝时由于缓冲区溢出而破坏了栈中内容而导致程序异常终止。...而不幸情况是,如果超出buff部分存储在了栈帧不属于它自己位置,即覆盖了栈帧上存储其他信息,就有可能导致程序在其他位置出错,造成问题难以定位。...当然也有很幸运时候,那就是超出buff部分存储在了未被使用栈空间上。但是我们绝对不可以对此抱有侥幸心理。...如何避免 对于前面所示例子中,我们可以很明显地看到要拷贝字符串长度大于buff长度,我们可以选择将buff长度增大。但是实际编程中,我们经常难以察觉是否会超过缓冲区大小。

    1.7K30

    C语言实例_双向链表增删改

    一、双向链表介绍 双向链表(Doubly Linked List)是一种常见数据结构,在单链表基础上增加了向前遍历功能。...与单向链表不同,双向链表每个节点除了包含指向下一个节点指针外,还包含指向前一个节点指针。...(3)实现LRU缓存替换算法:LRU缓存中,最近最少使用数据被淘汰,可以使用双向链表来维护缓存中数据,最近访问数据位于链表头部,最久未访问数据位于链表尾部。...在许多常见数据结构和算法中都有广泛应用。 二、代码实现 以下是使用C语言实现完整双向链表代码,包含了链表创建、增加、删除、修改、排序和插入等功能。代码中封装了一套完整子函数,以方便使用。...如果要删除位置为0,即删除头节点,需要特殊处理,即将头节点下一个节点设置为新头节点,并将新头节点prev指针设置为NULL。

    14910

    C语言实现单链表-增删改

    链表是由一连串节点组成数据结构,每个节点包含一个数据值和一个指向下一个节点指针。链表可以在头部和尾部插入和删除节点,因此可以在任何地方插入和删除节点,从而使其变得灵活和易于实现。...链表优点是可以快速随机访问节点,而缺点是插入和删除操作相对慢一些,因为需要移动节点。此外,链表长度通常受限于内存空间,因此当链表变得很长时,可能需要通过分页或链表分段等方式来管理其内存。...下面是一套封装好单链表框架,包括创建链表、插入节点、删除节点、修改节点、遍历节点和清空链表等常见操作,其中每个节点存储一个结构体变量,该结构体中包含一个名为dataint类型成员。...成员和一个指向下一个节点指针。...接着定义了用于创建新节点、插入节点、删除节点、修改节点、遍历节点和清空链表等操作子函数,并在main函数中演示了这些操作使用例子。在使用完链表后一定要调用clearList函数释放内存空间。

    40520

    线性表】—不带头单向非循环链表增删

    链表 链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表中指针链接次序实现 。...我们发现,链式结构其实就是在该节点存放下一个节点地址,然后通过地址便可以访问到该节点下一个节点。而上图中箭头,只是为了方便理解,一个一个连接起来,但实际上是并不存在。...这里需要注意就是,假如只有一个节点情况下,该节点next就是空指针,然后再next就形成了空指针解引用操作(NULL->next)这是错误,所以我们要考虑到只剩一个节点特殊情况,另外,还要注意空表状态是不可删除...头插与头删 头插 单链表头插最为简单,时间复杂度达到了O(1),还是通过画图从而更好理解。这里只需要将新节点next指向目前头指针,然后头指针再更新为新节点即可。...头删 这里我们需要注意就是,空表不可进行删除,然后其余画个图就一目了然,需要注意是,这里依然是改变list,所以还是用二级指针。

    35420

    【数据结构(C语言版)系列一】 线性表

    (5)输出 一个算法有一个或多个输出,这些输出是同输入有着某些特定关系量。 线性表——顺序存储结构 线性表顺序顺序表示指的是用一组地址连续存储单元依次存储线性表数据元素。...假设线性表每个元素需占用l个存储单元,并一所占第一个单元存储地址作为数据元素存储位置。...则线性表中第i+1个数据原色存储位置LOC(ai+1)和第i个数据元素存储位置LOC(ai)之间满足下列关系:  LOC(ai+1) = LOC(ai) + l 一般来说,线性表第i个数据元素ai...存储位置为:  LOC(ai) = LOC(a1) + (i-1) * l LOC(a1)指线性表第一个数据元素a1存储位置,通常称做线性表起始位置或基地址。...只要确定了存储线性表起始位置,线性表中任一数据元素都可随机存取,所以线性表顺序存储结构是一种随机存取存储结构。 若表长为n,为删除或插入元素时间复杂度为O(n)。

    2.2K30

    带头双向循环链表增删改实现(C语言

    带头双向循环链表 结点结构与头结点创建 头插尾插 打印链表 头删与尾删 链表查找 在pos前面进行插入与删除pos位置结点 销毁链表 完整代码 结点结构与头结点创建 创建两个源文件和一个头文件...test.c linked_list.c linked_list.h 带头双向循环链表,那么,结点结构就要有两个指针域,分别指向前一个结点和后一个结点。...//linked_list.c LL* BuyLisNode(TYPE x) { LL* newnode = (LL*)malloc(sizeof(LL)); if (newnode == NULL...void ListErase(LL* pos);//删除pos位置结点 void ListDestory(LL* phead);//销毁链表 linked_list.c #include "linked_list.h...} test.c #include "linked_list.h" void test() { LL* head = NULL; head = ListCreate();//创建头结点 ListPushBack

    56800
    领券