链表基本操作的实现 建立单链表存储数据(10,20,30,40,50,60,70,80,90,100),要求: (1)头插法或尾插法建立单链表,并输出单链表中所有元素; (2)输出单链表中的最大值和最小值; (3)键盘输入一个值x,输出链表中第一个值为x的元素的位序; (4)键盘输入一位序值b,在第b个元素之前插入值为500的元素,输出链表中的所有数据; (5)键盘输入位序值m,删除位序为m的元素,输出链表中的所有数据; (6)输出单链表的长度。 (要求尽量将每一个操作模块化,可以将链表头指针设置成全局变量,也可以采用引用型参数。)c语言实现
时间: 2024-03-01 12:52:06 浏览: 67
单链表的建立、插入、删除、查找.rar_单链表的建立、插入、删除、查找_插入删除
5星 · 资源好评率100%
以下是基于头插法的单链表的实现,包含了所要求的所有操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 链表头指针
Node* head = NULL;
// 创建链表
void createList(int arr[], int size, int method) {
Node* temp;
if (method == 1) { // 头插法
for (int i = 0; i < size; i++) {
temp = (Node*)malloc(sizeof(Node));
temp->data = arr[i];
temp->next = head;
head = temp;
}
}
else { // 尾插法
head = (Node*)malloc(sizeof(Node));
head->data = arr[0];
head->next = NULL;
Node* tail = head;
for (int i = 1; i < size; i++) {
temp = (Node*)malloc(sizeof(Node));
temp->data = arr[i];
temp->next = NULL;
tail->next = temp;
tail = temp;
}
}
}
// 输出链表元素
void printList() {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 查找最大值
int findMax() {
if (head == NULL) {
return -1; // 空链表
}
int max = head->data;
Node* temp = head->next;
while (temp != NULL) {
if (temp->data > max) {
max = temp->data;
}
temp = temp->next;
}
return max;
}
// 查找最小值
int findMin() {
if (head == NULL) {
return -1; // 空链表
}
int min = head->data;
Node* temp = head->next;
while (temp != NULL) {
if (temp->data < min) {
min = temp->data;
}
temp = temp->next;
}
return min;
}
// 查找第一个值为x的元素的位序
int findPos(int x) {
if (head == NULL) {
return -1; // 空链表
}
int pos = 1;
Node* temp = head;
while (temp != NULL) {
if (temp->data == x) {
return pos;
}
pos++;
temp = temp->next;
}
return -1; // 没有找到
}
// 在第b个元素之前插入值为500的元素
void insertNode(int b) {
if (head == NULL) {
return; // 空链表
}
Node* temp = head;
Node* prev = NULL;
int pos = 1;
while (temp != NULL) {
if (pos == b) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = 500;
newNode->next = temp;
if (prev != NULL) {
prev->next = newNode;
}
else {
head = newNode;
}
return;
}
pos++;
prev = temp;
temp = temp->next;
}
}
// 删除第m个元素
void deleteNode(int m) {
if (head == NULL) {
return; // 空链表
}
Node* temp = head;
Node* prev = NULL;
int pos = 1;
while (temp != NULL) {
if (pos == m) {
if (prev != NULL) {
prev->next = temp->next;
}
else {
head = temp->next;
}
free(temp);
return;
}
pos++;
prev = temp;
temp = temp->next;
}
}
// 输出链表长度
int listLength() {
Node* temp = head;
int len = 0;
while (temp != NULL) {
len++;
temp = temp->next;
}
return len;
}
int main() {
int arr[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
int size = sizeof(arr) / sizeof(arr[0]);
// 头插法创建链表
createList(arr, size, 1);
// 输出链表元素
printf("链表中所有元素:");
printList();
// 查找最大值和最小值
printf("链表中的最大值:%d\n", findMax());
printf("链表中的最小值:%d\n", findMin());
// 查找第一个值为x的元素的位序
int x;
printf("请输入要查找的值x:");
scanf("%d", &x);
int pos = findPos(x);
if (pos != -1) {
printf("值为%d的元素的位序:%d\n", x, pos);
}
else {
printf("没有找到值为%d的元素\n", x);
}
// 在第b个元素之前插入值为500的元素
int b;
printf("请输入要插入的位置b:");
scanf("%d", &b);
insertNode(b);
printf("插入后链表中所有元素:");
printList();
// 删除第m个元素
int m;
printf("请输入要删除的位置m:");
scanf("%d", &m);
deleteNode(m);
printf("删除后链表中所有元素:");
printList();
// 输出链表长度
printf("链表的长度:%d\n", listLength());
return 0;
}
```
注意:本代码中的链表头指针 `head` 是定义在全局作用域中的,因此不需要使用引用型参数来传递它。但如果你将链表头指针定义在其他作用域中,建议使用引用型参数来传递它,以便在函数中能够修改它的值。
阅读全文