顺序表(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Oracle_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值