当前位置: 首页 > news >正文

顺序表(C)

1.顺序表的概念

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和删除元素时,可能需要移动大量元素,效率相对较低。

2. 实现顺序表操作

#ifndef TEST_H
#define TEST_H

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int length;
} SeqList;

void initList(SeqList *list);
void insertAtTail(SeqList *list, int value);
void traverseList(SeqList *list);
void deleteAtTail(SeqList *list);
void insertAtPosition(SeqList *list, int position, int value);
void deleteAtPosition(SeqList *list, int position);
void updateAtPosition(SeqList *list, int position, int value);
int findAtPosition(SeqList *list, int position);
void deleteByValue(SeqList *list, int value);
void updateByValue(SeqList *list, int oldValue, int newValue);
int findByValue(SeqList *list, int value);
void removeDuplicates(SeqList *list);
void bubbleSort(SeqList *list);

#endif // TEST_H
#include "test.h"
#include <stdio.h>

void initList(SeqList *list) {
    list->length = 0;
}

void insertAtTail(SeqList *list, int value) {
    if (list->length >= MAX_SIZE) {
        printf("List is full!\n");
        return;
    }
    list->data[list->length++] = value;
}

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

void deleteAtTail(SeqList *list) {
    if (list->length == 0) {
        printf("List is empty!\n");
        return;
    }
    list->length--;
}

void insertAtPosition(SeqList *list, int position, int value) {
    if (list->length >= MAX_SIZE) {
        printf("List is full!\n");
        return;
    }
    if (position < 0 || position > list->length) {
        printf("Invalid position!\n");
        return;
    }
    for (int i = list->length; i > position; i--) {
        list->data[i] = list->data[i - 1];
    }
    list->data[position] = value;
    list->length++;
}

void deleteAtPosition(SeqList *list, int position) {
    if (list->length == 0) {
        printf("List is empty!\n");
        return;
    }
    if (position < 0 || position >= list->length) {
        printf("Invalid position!\n");
        return;
    }
    for (int i = position; i < list->length - 1; i++) {
        list->data[i] = list->data[i + 1];
    }
    list->length--;
}

void updateAtPosition(SeqList *list, int position, int value) {
    if (position < 0 || position >= list->length) {
        printf("Invalid position!\n");
        return;
    }
    list->data[position] = value;
}

int findAtPosition(SeqList *list, int position) {
    if (position < 0 || position >= list->length) {
        printf("Invalid position!\n");
        return -1;
    }
    return list->data[position];
}

void deleteByValue(SeqList *list, int value) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == value) {
            for (int j = i; j < list->length - 1; j++) {
                list->data[j] = list->data[j + 1];
            }
            list->length--;
            i--; // Re-check the current position after deletion
        }
    }
    printf("Value not found!\n");
}

void updateByValue(SeqList *list, int oldValue, int newValue) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == oldValue) {
            list->data[i] = newValue;
            return;
        }
    }
    printf("Value not found!\n");
}

int findByValue(SeqList *list, int value) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == value) {
            return i;
        }
    }
    printf("Value not found!\n");
    return -1;
}

void removeDuplicates(SeqList *list) {
    for (int i = 0; i < list->length; i++) {
        for (int j = i + 1; j < list->length; j++) {
            if (list->data[i] == list->data[j]) {
                for (int k = j; k < list->length - 1; k++) {
                    list->data[k] = list->data[k + 1];
                }
                list->length--;
                j--; // Re-check the current position after deletion
            }
        }
    }
}

void bubbleSort(SeqList *list) {
    for (int i = 0; i < list->length - 1; i++) {
        for (int j = 0; j < list->length - i - 1; j++) {
            if (list->data[j] > list->data[j + 1]) {
                int temp = list->data[j];
                list->data[j] = list->data[j + 1];
                list->data[j + 1] = temp;
            }
        }
    }
}
#include "test.h"

int main() {
    SeqList list;
    initList(&list);

    insertAtTail(&list, 3);
    insertAtTail(&list, 1);
    insertAtTail(&list, 4);
    insertAtTail(&list, 1);
    insertAtTail(&list, 5);

    printf("Original list: ");
    traverseList(&list);

    insertAtPosition(&list, 2, 2);
    printf("After inserting 2 at position 2: ");
    traverseList(&list);

    deleteAtPosition(&list, 1);
    printf("After deleting at position 1: ");
    traverseList(&list);

    updateAtPosition(&list, 2, 6);
    printf("After updating position 2 to 6: ");
    traverseList(&list);

    int value = findAtPosition(&list, 2);
    printf("Value at position 2: %d\n", value);

    deleteByValue(&list, 4);
    printf("After deleting value 4: ");
    traverseList(&list);

    updateByValue(&list, 6, 7);
    printf("After updating value 6 to 7: ");
    traverseList(&list);

    int pos = findByValue(&list, 7);
    printf("Position of value 7: %d\n", pos);

    removeDuplicates(&list);
    printf("After removing duplicates: ");
    traverseList(&list);

    bubbleSort(&list);
    printf("After sorting: ");
    traverseList(&list);

    return 0;
}

相关文章:

  • centos部署open-webui
  • MybatisMybatisPllus公共字段填充与配置逻辑删除
  • 【第12章:深度学习与伦理、隐私—12.1 AI伦理原则与偏见检测的方法与实践】
  • Jasper AI技术浅析(二):语言模型
  • docker部署笔记软件memos,通过5320端口访问,如何通过nginx反向代理配置访问?
  • 2025.2.16
  • Windows逆向工程入门之堆栈结构与信息获取
  • Qt 6.8版本 自制windows下运行软件<一>——串口调试助手
  • 在linux系统中安装Anaconda,并使用conda
  • 游戏引擎学习第106天
  • Moya 网络框架
  • Redis 的集群 --- 数据分开扛
  • 汇率波动(Exchange Rate Fluctuations)的逻辑:货币升值与贬值的深层原因解析(中英双语)
  • Windows11安装.NET35
  • 【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
  • ASP.NET配置文件多种方式读取
  • 求解插值多项式及余项表达式
  • C语言之easyX
  • 人形机器人 - 仿生机器人核心技术与大小脑
  • 使用 Python paramiko 自动备份设备配置实验
  • 商务部新闻发言人就中美经贸对话磋商情况答记者问
  • 国家卫健委对近日肖某引发舆情问题开展调查
  • 体坛联播|欧冠巴萨3比3战平国米,柯洁未进入国家集训队
  • 美乌签署协议建立美乌重建投资基金
  • 中国证券监督管理委员会党委委员、副主席王建军接受审查调查
  • 投资者建议发行优惠套票给“被套”小股东,张家界:将研究考虑