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语言深入浅出讲解顺序表的实现 顺序表简介 顺序表是一种线性表的存储结构,它是由连续的内存空间来存储线性表中的元素。 顺序表的特点是支持查找、插入和删除操作,操作效率较高,但需要提前分配足够大的内存空间。当顺序表空间不足时,需要扩容,移动数据较为麻烦。 顺序表的实现 数据结构定义 顺序表的数据结构定义包含以下几个成员: 数据元素数组 data,存储线性表中的…

    数据结构 2023年5月17日
    00
  • C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

    下面是关于C++二叉树数据结构的详细攻略。 什么是二叉树 二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。 递归遍历二叉树 前序遍历 前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。 下面是C++递归遍历二叉树的前序遍历示例代码: template <…

    数据结构 2023年5月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • C++数据结构之双向链表

    C++数据结构之双向链表完整攻略 1. 什么是双向链表 双向链表是一种特殊的链表结构,每个节点拥有两个指针域,分别指向前继和后继节点。 双向链表不需要像单向链表那样从头到尾遍历整个链表,可以通过前后指针直接访问前后节点,提高了查找、删除、插入等操作的效率。 双向链表有一些常用的操作,如插入节点、删除节点、查找节点等。 2. 双向链表的实现 2.1 节点定义 …

    数据结构 2023年5月17日
    00
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • Java数据结构之插入排序与希尔排序

    Java数据结构之插入排序与希尔排序 插入排序 插入排序是一种简单而有效的排序算法。它的基本思想是将一个元素插入已经排好序的部分中。插入排序的过程可以用以下伪代码表示: for i=1 to length-1 j = i while j > 0 and array[j-1] > array[j] swap array[j] and array[j…

    数据结构 2023年5月17日
    00
  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • 详解Pytorch中的tensor数据结构

    详解Pytorch中的Tensor数据结构 在Pytorch中,Tensor是一种重要的数据结构,它是一个多维数组(类似于NumPy的ndarray),并且支持GPU加速操作。在本文中,我们将详细介绍Pytorch中的Tensor数据结构,包括如何创建、初始化、检索和修改Tensor对象。 创建Tensor对象 创建Tensor对象的方法有很多种。以下是一些…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部