C语言线性表全面梳理操作方法

C语言线性表全面梳理操作方法

线性表概述

线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。

线性表有两种存储方式: 顺序存储结构链式存储结构

顺序存储结构

顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。

代码示例:创建顺序存储线性表

#define MaxSize 100   // 定义线性表最大长度
typedef struct{
    int data[MaxSize]; // 存储顺序表的元素
    int length; // 当前线性表的长度
} SeqList;

void CreateSeqList(SeqList *L, int n){
    int i;
    printf("请输入%d个元素:\n", n);
    for(i=0; i<n; i++){
        scanf("%d", &L->data[i]); // 输入数据
    }
    L->length = n; // 修改线性表长度
}

代码示例:访问顺序表元素

int GetElem(SeqList *L, int i){
    if(i<1 || i>L->length){ // i值不合法
        printf("查找位置不合法\n");
        return -1;
    }
    return L->data[i-1]; // 返回第i个位置上的元素
}

链式存储结构

链式存储结构是指采用链式存储方式存储线性表,即将线性表的元素存储在多个存储空间中,两个相邻元素之间通过指针相连。

代码示例:创建链式存储线性表

typedef struct ListNode{
    int data; // 数据域
    struct ListNode *next; // 指针域
} ListNode, *LinkList;

void CreateLinkList(LinkList *L, int n){
    int i;
    ListNode *p;
    *L = (LinkList)malloc(sizeof(ListNode)); // 创建头结点
    (*L)->next = NULL; // 空链表
    printf("请输入%d个元素:\n", n);
    for(i=0; i<n; i++){
        p = (ListNode*)malloc(sizeof(ListNode));
        scanf("%d", &p->data); // 输入数据
        p->next = (*L)->next;
        (*L)->next = p;
    }
}

代码示例:访问链式表元素

int GetElem(LinkList L, int i){
    int j = 1;
    ListNode *p = L->next;
    while(p && j<i){ // 寻找第i个结点
        p = p->next;
        j++;
    }
    if(!p || j>i){ // i不合法
        printf("查找位置不合法\n");
        return -1;
    }
    return p->data;
}

操作方法

C语言提供了丰富的线性表操作方法,以下是常用的操作方法:

1. 插入操作

在线性表的指定位置插入一个元素,需要将插入位置后续的元素依次后移。

顺序存储结构的插入操作:

void Insert(SeqList *L, int i, int x){
    int j;
    if(L->length==MaxSize){ // 线性表已满,不能插入
        printf("线性表已满,不能插入\n");
        return;
    }
    if(i<1 || i>L->length+1){ // i值不合法
        printf("插入位置不合法\n");
        return;
    }
    for(j=L->length; j>=i; j--){ // 将第i个位置后的元素依次后移
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = x; // 在位置i插入x
    L->length++; // 线性表长度+1
}

链式存储结构的插入操作:

int Insert(LinkList *L, int i, int x){
    int j = 0;
    ListNode *p = *L, *s;
    while(p && j<i-1){ // 寻找第i-1个结点
        p = p->next;
        j++;
    }
    if(!p || j>i-1){ // i不合法
        printf("插入位置不合法\n");
        return 0;
    }
    s = (ListNode*)malloc(sizeof(ListNode)); // 创建新结点
    s->data = x;
    s->next = p->next; // 插入结点
    p->next = s;
    return 1;
}

2. 删除操作

删除线性表中指定位置的元素,需要将删除位置后续的元素依次前移。

顺序存储结构的删除操作:

int Delete(SeqList *L, int i){
    int j;
    if(i<1 || i>L->length){ // i不合法
        printf("删除位置不合法\n");
        return 0;
    }
    for(j=i; j<L->length; j++){ // 将第i个位置后的元素依次前移
        L->data[j-1] = L->data[j];
    }
    L->length--; // 线性表长度-1
    return 1;
}

链式存储结构的删除操作:

int Delete(LinkList *L, int i){
    int j = 0;
    ListNode *p = (*L), *q;
    while(p->next && j<i-1){ // 寻找第i-1个结点
        p = p->next;
        j++;
    }
    if(!(p->next) || j>i-1){ // i不合法
        printf("删除位置不合法\n");
        return 0;
    }
    q = p->next;
    p->next = q->next; // 删除结点
    free(q);
    return 1;
}

总结

本文介绍了线性表的概念和两种存储方式,以及几种常用的操作方法。顺序存储结构的插入和删除操作需要将后续元素依次前移或后移,效率较低;链式存储结构的插入和删除操作则只需修改指针域,效率较高。对于不同的应用场景选择合适的存储方式和操作方法,可以提高程序的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言线性表全面梳理操作方法 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言线性表的链式表示及实现详解

    C语言线性表的链式表示及实现详解 什么是线性表 线性表是一种在计算机科学中常见的数据结构,它由一组连接在一起的元素组成,每个元素都包含前后指针以指向相邻的元素,从而构成一个连续的线性序列。线性表可以用来存储和处理一般数据集合。 链式存储结构 线性表的链式存储结构是由若干个结构体组成的链表,每个结构体都称为一个节点。每个节点包含两个字段:一个数据域用来存放数据…

    数据结构 2023年5月17日
    00
  • Python 数据结构之旋转链表

    Python 数据结构之旋转链表 简介 在进行链表操作时,有时需要旋转链表的一部分,即将链表的最后几个节点移到链表的头部。本文将讲解 Python 实现旋转链表的方法。 方法 我们需要了解两个概念:旋转链表、链表反转。 旋转链表 假设链表为1-2-3-4-5,k=2,将链表后两个节点移动到链表头部,即转化为4-5-1-2-3。 做法如下: 先遍历链表,得出链…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构Number

    JavaScript数据结构Number 简介 JavaScript中的Number是一种表示数字的数据类型,包括整数和浮点数。Number类型的值是不可变的。 数字类型(Number)的创建 数字类型可以通过直接赋值的方式创建,如: let num = 10; // 整数 let floatNum = 3.14; // 浮点数 另外,JavaScript还…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

    数据结构 2023年5月17日
    00
  • C语言数据结构时间复杂度及空间复杂度简要分析

    C语言数据结构时间复杂度及空间复杂度简要分析 什么是时间复杂度和空间复杂度? 在分析算法和数据结构的性能时,时间复杂度和空间复杂度是必须考虑的因素。 时间复杂度:衡量算法执行时间所需的资源,也就是算法的速度。通常使用“大O符号”来表示时间复杂度,例如O(1)、O(n)、O(nlogn)等。 空间复杂度:衡量算法使用的内存资源,也就是算法的空间利用率。通常使用…

    数据结构 2023年5月17日
    00
  • C++数据结构之搜索二叉树的实现

    C++数据结构之搜索二叉树的实现 搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。 一、搜索二叉树的定义 搜索二叉树是一种二叉树,它满足以下性质: 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它; 每个节点的左右子树也都…

    数据结构 2023年5月17日
    00
  • 数据结构Typescript之哈希表实现详解

    数据结构Typescript之哈希表实现详解 什么是哈希表 哈希表(Hash Table)又称为散列表,是一种根据关键字(Key)直接访问内存存储位置的数据结构。通俗的解释就是利用一个哈希函数(Hash Function)将关键字映射到哈希表中的一个位置(索引)来进行访问,从而快速、高效地查找、插入、删除元素。 哈希表的实现 本文将介绍使用Typescrip…

    数据结构 2023年5月17日
    00
  • 贪心算法基础及leetcode例题

    理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 贪心算法一般分为如下…

    算法与数据结构 2023年4月20日
    00
合作推广
合作推广
分享本页
返回顶部