链表的基础

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

// 线性表结构体  
typedef struct Node {  
    int data; // 使用 int 数据类型来存储整数  
    struct Node* next; // 下一个节点的指针  
} Link;  

// 创建链表的函数,从用户输入构建链表,输入 -1 时停止  
Link* creatTailList() {  // 尾插法带头节点   
    Link *head = NULL; // 头指针  
    Link *last = NULL; // 上一个节点指针  
    int x;  
    
    printf("请输入数值,输入 -1 结束:\n");  
    scanf("%d", &x);  
    
    while (x != -1) {  // 1.赋值 2.改前指针 3.改变 s、r   
        Link *newNode = (Link*)malloc(sizeof(Link));  
        newNode->data = x; // 从输入中获取值并存储到新节点  
        newNode->next = NULL; // 新节点的下一个指针设为空  

        if (head == NULL) { // 如果链表为空  
            head = newNode; // 第一个节点赋值给头指针  
        } else {  
            last->next = newNode; // 上一个节点的下一个指针指向新节点  
        }  
        last = newNode; // 更新上一个节点为新节点  
        scanf("%d", &x);  
    }   

    return head; // 返回头指针  
}  

Link* getElem(Link* L, int i) {  
    Link *p = L;  
    int j = 0;  
    while (p && j < i) {  
        p = p->next;  
        j++;  
    }  
    return p; // 返回第 i 个节点  
}  

void printList(Link* L) {  
    Link* p = L; // 使用指针遍历列表  
    while (p != NULL) {  
        printf("%d ", p->data); // 打印当前节点的数据  
        p = p->next; // 移动到下一个节点  
    }  
    printf("\n");  
}  

int main() {  
    Link* list = creatTailList(); // 创建链表  
    printf("线性表的元素为:\n");  
    printList(list); // 打印列表  
    
    int index;  
    printf("请输入要获取元素的索引 (从 0 开始): ");  
    scanf("%d", &index); // 获取用户输入的索引  
    Link* elem = getElem(list, index); // 获取指定位置的元素  
    if (elem != NULL) {  
        printf("索引 %d 处的元素为: %d\n", index, elem->data); // 输出结果  
    } else {  
        printf("没有找到索引 %d 的元素.\n", index); // 如果不存在该位置的元素  
    }  

    // 释放链表的内存  
    Link *temp;  
    while (list != NULL) {  
        temp = list; // 保存当前节点指针  
        list = list->next; // 移动到下一个节点  
        free(temp); // 释放当前节点  
    }  

    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值