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

// 定义顺序表结构体
typedef struct {
    int *data;  // 数据指针
    int length; // 当前长度
    int maxSize; // 最大长度
} SeqList;

// 初始化顺序表
void init(SeqList *list, int maxSize) {
    list->data = (int *)malloc(maxSize * sizeof(int));
    list->length = 0;
    list->maxSize = maxSize;
}

// 插入元素
int insert(SeqList *list, int index, int element) {
    if (index < 0 || index > list->length) {
        printf('插入位置错误\n');
        return 0;
    }
    if (list->length >= list->maxSize) {
        printf('顺序表已满,无法插入\n');
        return 0;
    }
    for (int i = list->length; i > index; i--) {
        list->data[i] = list->data[i-1];
    }
    list->data[index] = element;
    list->length++;
    return 1;
}

// 删除元素
int removeElement(SeqList *list, int index) {
    if (index < 0 || index >= list->length) {
        printf('删除位置错误\n');
        return 0;
    }
    for (int i = index; i < list->length - 1; i++) {
        list->data[i] = list->data[i+1];
    }
    list->length--;
    return 1;
}

// 取元素
int getElement(SeqList *list, int index) {
    if (index < 0 || index >= list->length) {
        printf('取元素位置错误\n');
        return -1;
    }
    return list->data[index];
}

// 单链表结点结构体
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 创建单链表
Node* createLinkedList() {
    Node *head = NULL;
    int value;
    printf('请输入元素的值,以-1结束输入:\n');
    scanf('%d', &value);
    while (value != -1) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = value;
        newNode->next = head;
        head = newNode;
        scanf('%d', &value);
    }
    return head;
}

// 输出单链表
void printLinkedList(Node *head) {
    Node *p = head;
    while (p != NULL) {
        printf('%d ', p->data);
        p = p->next;
    }
    printf('\n');
}

// 在单链表的第index个位置插入元素
void insertLinkedList(Node *head, int index, int element) {
    Node *p = head;
    int count = 0;
    while (p != NULL && count < index - 1) {
        p = p->next;
        count++;
    }
    if (p == NULL || count > index - 1) {
        printf('插入位置错误\n');
        return;
    }
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = element;
    newNode->next = p->next;
    p->next = newNode;
    printf('插入成功\n');
}

// 删除单链表中的第index个元素
void removeLinkedList(Node *head, int index) {
    Node *p = head;
    int count = 0;
    while (p != NULL && count < index - 1) {
        p = p->next;
        count++;
    }
    if (p == NULL || count > index - 1 || p->next == NULL) {
        printf('删除位置错误\n');
        return;
    }
    Node *temp = p->next;
    p->next = temp->next;
    free(temp);
    printf('删除成功\n');
}

// 取单链表中的第index个元素
int getLinkedListElement(Node *head, int index) {
    Node *p = head;
    int count = 0;
    while (p != NULL && count < index) {
        p = p->next;
        count++;
    }
    if (p == NULL || count > index) {
        printf('取元素位置错误\n');
        return -1;
    }
    return p->data;
}

int main() {
    // 顺序表操作
    SeqList list;
    init(&list, 10);
    insert(&list, 0, 1);
    insert(&list, 1, 2);
    insert(&list, 2, 3);
    printf('顺序表中的元素:');
    for (int i = 0; i < list.length; i++) {
        printf('%d ', list.data[i]);
    }
    printf('\n');

    removeElement(&list, 1);
    printf('删除后顺序表中的元素:');
    for (int i = 0; i < list.length; i++) {
        printf('%d ', list.data[i]);
    }
    printf('\n');

    printf('顺序表中的第2个元素:%d\n', getElement(&list, 1));

    // 单链表操作
    Node *head = createLinkedList();
    printf('单链表中的元素:');
    printLinkedList(head);

    insertLinkedList(head, 3, 67);
    insertLinkedList(head, 9, 10);
    printf('插入后单链表中的元素:');
    printLinkedList(head);

    removeLinkedList(head, 6);
    removeLinkedList(head, 8);
    printf('删除后单链表中的元素:');
    printLinkedList(head);

    printf('单链表中的第5个元素:%d\n', getLinkedListElement(head, 5));
    printf('单链表中的第7个元素:%d\n', getLinkedListElement(head, 7));

    return 0;
}

代码讲解内容:

这段代码实现了顺序表和单链表的基本操作,包括初始化、插入、删除、取元素等。

首先,定义了顺序表结构体SeqList,包含了数据指针data、当前长度length和最大长度maxSize。通过init函数进行初始化,动态分配内存空间。

然后,实现了顺序表的插入、删除和取元素操作。插入操作使用了循环将插入位置之后的元素后移,然后将新元素插入到指定位置。删除操作同样使用了循环将删除位置之后的元素前移。取元素操作直接返回指定位置的元素。

接下来,定义了单链表结点结构体Node,包含了数据data和指向下一个结点的指针next。通过createLinkedList函数创建单链表,用户输入元素的值,以-1作为结束标志。使用循环创建新结点,将新结点插入到链表头部。使用printLinkedList函数输出单链表中的元素。

然后,实现了单链表的插入、删除和取元素操作。插入操作先找到插入位置的前一个结点,然后创建新结点,将新结点插入到该位置。删除操作先找到删除位置的前一个结点,然后将删除位置的结点从链表中移除。取元素操作先找到指定位置的结点,然后返回其数据。

最后,在main函数中演示了顺序表和单链表的操作。创建顺序表并插入元素,然后删除元素,并取指定位置的元素。创建单链表并插入元素,然后删除元素,并取指定位置的元素。

C语言顺序表和单链表实现及操作示例

原文地址: https://www.cveoy.top/t/topic/f3xZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录