单链表操作项目实训报告

已知一组整数已存入一个一维数组中,试用该组整数建立一个单链表,
再实现单链表的逆置操作。


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

// 定义单链表结构体
struct Node {
    int data; // 数据域
    struct Node* next; // 指针域
};

// 建立单链表的函数,返回链表头结点
struct Node* createLinkedList(int arr[], int n) {
    struct Node *head, *p, *q;
    int i;
    head = (struct Node*)malloc(sizeof(struct Node)); // 创建头结点
    p = head; // 初始化 p 指向头结点
    for (i = 0; i < n; i++) {
        q = (struct Node*)malloc(sizeof(struct Node)); // 创建新结点
        q->data = arr[i]; // 新结点赋值
        p->next = q; // 将新结点插入到链表中
        p = q; // 将指针 p 移动到新结点
    }
    p->next = NULL; // 尾结点指向 NULL,表示链表结束
    return head; // 返回头结点
}

// 逆置单链表的函数,返回链表头结点
struct Node* reverseLinkedList(struct Node* head) {
    if (head == NULL || head->next == NULL) { // 空链表或只有一个结点的情况
        return head; // 直接返回头结点
    }
    struct Node *p, *q, *r; // 定义三个指针,p 指向头结点,q 指向第一个结点,r 指向第二个结点
    p = head;
    q = head->next;
    r = q->next;
    p->next = NULL; // 将头结点的指针域设为 NULL,表示逆置后的尾结点
    while (r != NULL) { // 逐个将结点插入到头结点之后
        q->next = p; // q 的指针域指向上一个结点 p
        p = q; // p 后移
        q = r; // q 后移
        r = r->next; // r 后移
    }
    q->next = p; // 最后一个结点 q 的指针域指向上一个结点 p
    return q; // 返回逆置后的头结点
}

int main() {
    int arr[] = {1, 2, 3, 4, 5}; // 测试数据
    int n = sizeof(arr) / sizeof(int); // 数组长度
    struct Node* head = createLinkedList(arr, n); // 建立单链表
    printf("原链表:");
    struct Node* p = head->next;
    while (p != NULL) { // 遍历链表并输出
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    head->next = reverseLinkedList(head->next); // 逆置单链表
    printf("逆置后的链表:");
    p = head->next;
    while (p != NULL) { // 遍历
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int  data;
    struct node* next;
}Node, *List;
void createlist(List* L, int *a, int n)
{
    int i;
    List pL = NULL, pt = NULL;
    for (i = 0; i < n; i++)
    {
        pt = (List)malloc(sizeof(Node));
        pt->next = NULL;
        pt->data = a[i];
        if (!(*L))
            (*L) = pt;
        else
            pL->next = pt;
        pL = pt;
    }
}
void printlist(List L)
{
    List p = L;
    while(p){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
void reverselist(List* L)
{
    List pL = (*L), pt = NULL;
    (*L) = NULL;
    while (pL){
        pt = pL;
        pL = pL->next;
        pt->next = (*L);
        (*L) = pt;
    }
}

int main()
{
    int a[]={2,3,5,1,7,9,6,10,4};
    List L = NULL;

    createlist(&L, a, sizeof(a)/sizeof(a[0]));//创建链表
    printlist(L);                             //输出链表

    reverselist(&L);                          //逆置链表
    printlist(L);                             //输出链表

    return 0;
}