线性表与C语言实现【算法 10】

线性表与C语言实现

请添加图片描述

1. 线性表的概念

线性表是一种数据结构,它是由n个数据元素构成的有限序列。线性表的特点是:表中的元素有序排列,并且每个元素都有唯一的前驱和后继(首元素除外,没有前驱;尾元素除外,没有后继)。

线性表的常见实现方式有两种:

  1. 顺序存储结构:即使用数组来存储数据。
  2. 链式存储结构:即使用链表来存储数据。

2. 线性表的基本操作

无论使用哪种存储方式,线性表的基本操作一般包括:

  • 插入元素
  • 删除元素
  • 查找元素
  • 获取元素
  • 遍历线性表

接下来,我们将介绍如何使用C语言来实现线性表的顺序存储和链式存储。


3. 顺序表的实现

3.1 顺序表的定义

顺序表是将线性表中的元素按顺序存储在一段连续的存储空间中。在C语言中,通常用数组来实现顺序表。

#include <stdio.h>

#define MAX_SIZE 100  // 定义顺序表的最大容量

typedef struct {
    int data[MAX_SIZE];  // 存放顺序表元素的数组
    int length;          // 顺序表的长度
} SeqList;

3.2 顺序表的插入操作

在顺序表的第pos位置插入元素e,首先要判断表是否已满,然后判断插入位置是否合法,最后从插入位置开始将后面的元素依次后移,空出位置插入新元素。

int insert(SeqList *list, int pos, int e) {
    if (list->length >= MAX_SIZE) {
        printf("顺序表已满,无法插入元素\n");
        return -1;
    }
    if (pos < 1 || pos > list->length + 1) {
        printf("插入位置不合法\n");
        return -1;
    }
    for (int i = list->length; i >= pos; i--) {
        list->data[i] = list->data[i - 1];
    }
    list->data[pos - 1] = e;
    list->length++;
    return 0;
}

3.3 顺序表的删除操作

删除顺序表中第pos位置的元素,首先检查位置是否合法,然后将被删除位置后面的元素依次前移。

int delete(SeqList *list, int pos) {
    if (pos < 1 || pos > list->length) {
        printf("删除位置不合法\n");
        return -1;
    }
    for (int i = pos; i < list->length; i++) {
        list->data[i - 1] = list->data[i];
    }
    list->length--;
    return 0;
}

3.4 顺序表的查找操作

查找顺序表中第pos位置的元素。

int get(SeqList *list, int pos, int *e) {
    if (pos < 1 || pos > list->length) {
        printf("查找位置不合法\n");
        return -1;
    }
    *e = list->data[pos - 1];
    return 0;
}

3.5 顺序表的遍历

遍历顺序表中的所有元素。

void traverse(SeqList *list) {
    for (int i = 0; i < list->length; i++) {
        printf("%d ", list->data[i]);
    }
    printf("\n");
}

4. 链表的实现

4.1 单链表的定义

链表通过指针来存储数据,每个节点包含一个数据域和一个指向下一个节点的指针。以下是单链表的节点结构定义:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;              // 数据域
    struct Node *next;     // 指针域,指向下一个节点
} Node, *LinkedList;

4.2 单链表的插入操作

在单链表的第pos位置插入元素e

int insert(LinkedList *list, int pos, int e) {
    Node *p = *list;
    int i = 0;
    while (p && i < pos - 1) {
        p = p->next;
        i++;
    }
    if (!p || i > pos - 1) {
        printf("插入位置不合法\n");
        return -1;
    }
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = e;
    newNode->next = p->next;
    p->next = newNode;
    return 0;
}

4.3 单链表的删除操作

删除单链表中第pos位置的元素。

int delete(LinkedList *list, int pos) {
    Node *p = *list;
    int i = 0;
    while (p && i < pos - 1) {
        p = p->next;
        i++;
    }
    if (!p || !p->next) {
        printf("删除位置不合法\n");
        return -1;
    }
    Node *tmp = p->next;
    p->next = tmp->next;
    free(tmp);
    return 0;
}

4.4 单链表的查找操作

查找单链表中第pos位置的元素。

int get(LinkedList list, int pos, int *e) {
    Node *p = list->next;
    int i = 1;
    while (p && i < pos) {
        p = p->next;
        i++;
    }
    if (!p || i > pos) {
        printf("查找位置不合法\n");
        return -1;
    }
    *e = p->data;
    return 0;
}

4.5 单链表的遍历

遍历单链表中的所有元素。

void traverse(LinkedList list) {
    Node *p = list->next;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

5. 总结

线性表是数据结构中的重要概念,顺序存储结构和链式存储结构各有优缺点。在顺序表中,查询速度快,但插入和删除操作效率低;而链表在插入和删除操作时效率较高,但查询速度较慢。在实际应用中,应根据具体需求选择合适的存储结构。

通过本篇博客,我们不仅了解了线性表的理论知识,还学习了如何在C语言中实现顺序表和链表的各种操作。希望能对你在学习和使用线性表时有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值