#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表
Node* initList() {
return NULL;
}
// 添加节点
Node* addElement(Node* list, int element) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = element;
newNode->next = NULL;
if (list == NULL) {
list = newNode;
}
else {
Node* curNode = list;
while (curNode->next != NULL) {
curNode = curNode->next;
}
curNode->next = newNode;
}
return list; //返回修改后的链表
}
// 删除节点
Node* deleteElement(Node* list, int data) {
if (list == NULL) {
printf("链表为空,无法删除节点。\n");
return list;
}
if (list->data == data) {
Node* temp = list;
list = list->next;
free(temp);
return list;
}
Node* curNode = list;
while (curNode->next != NULL && curNode->next->data != data) {
curNode = curNode->next;
}
if (curNode->next == NULL) {
printf("未找到节点 %d,无法删除。\n", data);
return list;
}
Node* temp = curNode->next;
curNode->next = temp->next;
free(temp);
return list;
}
// 修改节点
int updateElement(Node* list, int oldData, int newData) {
Node* curNode = list;
while (curNode != NULL) {
if (curNode->data == oldData) {
curNode->data = newData;
return 1;
}
curNode = curNode->next;
}
printf("未找到节点 %d,无法修改。\n", oldData);
return 0;
}
// 查找节点
Node* findElement(Node* list, int data) {
Node* curNode = list;
while (curNode != NULL) {
if (curNode->data == data) {
return curNode;
}
curNode = curNode->next;
}
return NULL;
}
// 打印链表
void printList(Node* list) {
printf("[ ");
Node* curNode = list;
while (curNode != NULL) {
printf("%d ", curNode->data);
curNode = curNode->next;
}
printf("]\n");
}
int main() {
Node* myList = initList(); // 初始化链表
int n = 0;
int flag = 1;//判断用户选择数是否合法
while (flag)
{
printf("请输入线性表的一到十内的目标长度\n");
scanf_s("%d",&n);
if (n >= 1 && n <= 10)
{
flag = 0;
}
}
int dight = 0;
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:\n", i + 1);
scanf("%d", &dight);
addElement(myList, dight);
}
printList(myList); // 打印顺序表
int flags = 1;
while (flags)
{
int choice = 1;
int sth = 0;
int index = 0;
printf("------------------------------------------------------------------------------\n");
printf("请选择你想要的执行的操作:1.查找元素 2.修改元素 3.删除元素 4.添加元素 0.退出\n");
printf("------------------------------------------------------------------------------\n");
scanf("%d", &choice);
switch (choice)
{
case 0:
flags = 0;
break;
case 1:
printf("输入你想查找的元素,将得到索引值\n");
scanf("%d", &sth);
int index = findElement(myList, sth); // 查找元素,返回索引值
printf("元素2的索引是:%d\n", index);
break;
case 2:
printf("输入你想修改的元素索引值\n");
scanf("%d", &index);
printf("输入你想修改元素的值\n");
scanf("%d", &sth);
updateElement(myList, index, sth); // 修改元素
printList(myList); // 打印链表
break;
case 3:
printf("输入你想删除的元素的索引值\n");
scanf("%d", &index);
deleteElement(myList, index); // 删除元素
printList(myList); // 打印链表
break;
case 4:
printf("输入你想插入的元素索引值\n");
scanf("%d", &index);
printf("输入你想插入元素的值\n");
scanf("%d", &sth);
addElement(myList, sth); // 修改元素
printList(myList); // 打印链表
default:
break;
}
}
return 0;
}
链表不能读取元素,警告int 和Node*间接级别不同