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日

相关文章

  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • Java红黑树的数据结构与算法解析

    Java红黑树的数据结构与算法解析 红黑树简介 红黑树是一种平衡二叉搜索树,其中的每个节点上都有一个黑色或红色的标记,并且满足以下性质: 根节点是黑色的; 叶子节点是黑色的空节点(NULL); 如果一个节点是红色的,则其子节点必须是黑色的; 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点; 新插入的节点默认是红色的。 具体来说,只有在删除或者某…

    数据结构 2023年5月17日
    00
  • 4种非常实用的python内置数据结构

    下面是关于4种非常实用的Python内置数据结构的详细讲解。 1. List(列表) 列表是Python中最常用的数据结构之一。它可以用来存储有序的数据集合,并且可以通过索引访问其中的元素。 创建列表 要创建一个列表,可以使用方括号[]将元素括起来,用逗号,分隔。例如: fruits = [‘apple’, ‘banana’, ‘orange’] 访问列表元…

    数据结构 2023年5月17日
    00
  • C语言深入浅出解析二叉树

    C语言深入浅出解析二叉树攻略 什么是二叉树 二叉树是一种树形数据结构,其每个节点最多只有两个子节点,分别称为其左子节点和右子节点。一般采用链式存储方式来实现二叉树,也可以使用数组来存储。 二叉树的遍历 二叉树的遍历分为三种方式:前序遍历,中序遍历和后序遍历。 前序遍历 前序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。可以使用递归或栈来实现。 v…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之数组

    带你了解Java数据结构和算法之数组 在本教程中,我们将学习Java中的数组数据结构和对应的算法。让我们先来了解什么是数组。 什么是数组? 数组是一个同类型数据元素的集合,在内存中连续存储。数组具有索引性,我们可以使用索引值来访问数组中的元素。 声明和初始化数组 在Java中,声明一个数组需要指定以下三个参数: 数组的类型 数组的名称 数组的大小 以下是一个…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之图的遍历(一)

    我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。 简介 本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。 在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种…

    数据结构 2023年5月17日
    00
  • Java 超详细讲解数据结构的应用

    Java 超详细讲解数据结构的应用 简介 “Java 超详细讲解数据结构的应用”是一个基于Java语言的数据结构教程,其中包含了各种数据结构的理论知识和实际应用,在学习过程中可以帮助初学者更好地理解数据结构的本质和实际应用场景。 学习路径 数据结构理论 在本教程中,我们首先介绍了数据结构的几种基本分类和常用的数据结构,包括数组、链表、栈、队列、堆、树、图等等…

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