C语言线性表与链表操作实验:区间删除与倒数第m个元素

本实验通过C语言代码实现线性表元素的区间删除(顺序存储)和链表的倒数第m个元素查找(链式存储)。

1. 线性表的ADT表示

线性表的ADT表示可以使用结构体来定义,其中包括线性表的长度和存储元素的数组。

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];  // 存储元素的数组
    int length;  // 线性表的长度
} SeqList;

2. 数据类型定义和核心算法和程序

2.1 线性表元素的区间删除 (顺序存储)

核心算法:

  1. 遍历线性表,找到区间的起始位置和结束位置。
  2. 将区间内的元素删除,将后面的元素依次前移。
  3. 更新线性表的长度。
void deleteRange(SeqList *list, int start, int end) {
    if (start < 1 || end > list->length || start > end) {
        printf('Invalid range.
');
        return;
    }
    
    int i, j;
    for (i = start - 1, j = end; j < list->length; i++, j++) {
        list->data[i] = list->data[j];
    }
    
    list->length -= (end - start + 1);
}

2.2 求链表的倒数第m个元素(链式存储)

核心算法:

  1. 使用两个指针p和q,初始时都指向链表的头节点。
  2. 先将指针q向后移动m-1个位置。
  3. 然后同时将指针p和q向后移动,直到指针q指向链表的尾节点。
  4. 此时指针p指向的节点就是倒数第m个节点。
typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node* findLastM(Node *head, int m) {
    if (head == NULL || m <= 0) {
        return NULL;
    }
    
    Node *p = head;
    Node *q = head;
    
    int i;
    for (i = 0; i < m - 1; i++) {
        if (q->next != NULL) {
            q = q->next;
        } else {
            return NULL;
        }
    }
    
    while (q->next != NULL) {
        p = p->next;
        q = q->next;
    }
    
    return p;
}

3. 实验过程中出现的问题和解决的方法

问题1: 如何删除线性表中的元素? **解决方法: ** 可以使用遍历和移动元素的方法来删除线性表中的元素。

问题2: 如何找到链表的倒数第m个元素? **解决方法: ** 可以使用两个指针来遍历链表,一个指针先移动m-1个位置,然后两个指针同时移动,直到第一个指针指向链表的尾节点。

4. 完整的程序代码

#include <stdio.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];  // 存储元素的数组
    int length;  // 线性表的长度
} SeqList;

void deleteRange(SeqList *list, int start, int end) {
    if (start < 1 || end > list->length || start > end) {
        printf('Invalid range.
');
        return;
    }
    
    int i, j;
    for (i = start - 1, j = end; j < list->length; i++, j++) {
        list->data[i] = list->data[j];
    }
    
    list->length -= (end - start + 1);
}

typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node* findLastM(Node *head, int m) {
    if (head == NULL || m <= 0) {
        return NULL;
    }
    
    Node *p = head;
    Node *q = head;
    
    int i;
    for (i = 0; i < m - 1; i++) {
        if (q->next != NULL) {
            q = q->next;
        } else {
            return NULL;
        }
    }
    
    while (q->next != NULL) {
        p = p->next;
        q = q->next;
    }
    
    return p;
}

int main() {
    // 线性表元素的区间删除 (顺序存储)
    SeqList list = {{1, 2, 3, 4, 5, 6}, 6};
    deleteRange(&list, 2, 4);
    for (int i = 0; i < list.length; i++) {
        printf('%d ', list.data[i]);
    }
    printf('
');
    
    // 求链表的倒数第m个元素(链式存储)
    Node n6 = {6, NULL};
    Node n5 = {5, &n6};
    Node n4 = {4, &n5};
    Node n3 = {3, &n4};
    Node n2 = {2, &n3};
    Node n1 = {1, &n2};
    Node *head = &n1;
    Node *lastM = findLastM(head, 3);
    if (lastM != NULL) {
        printf('The last mth element is: %d
', lastM->data);
    } else {
        printf('Invalid m.
');
    }
    
    return 0;
}
C语言线性表与链表操作实验:区间删除与倒数第m个元素

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

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