#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;
}