设计一个算法在带头结点的非空单链表L中第一个最大值结点(最大值结点可能有多个)之前插入一个值为x的结点。自行设计数据实例,编写主函数,进行算法测试。用c语言实现
时间: 2024-06-12 14:10:53 浏览: 119
3-2 试编写一个算法,在带表头结点的单链表中寻找第i个结点.doc
好的,我理解了你的问题。下面是算法的实现过程:
1. 定义一个指针p指向头结点的下一个结点,定义一个指针pre指向头结点,定义一个变量max记录最大值。
2. 遍历链表,找到最大值max,并记录最大值结点的前驱结点pre。
3. 创建一个新结点s,将x赋值给s的数据域。
4. 将s插入到pre和pre->next之间。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
void insert(LinkList L, int x) {
Node *p = L->next, *pre = L, *s;
int max = p->data;
while (p != NULL) {
if (p->data > max) {
max = p->data;
pre = pre->next;
}
p = p->next;
}
s = (Node *)malloc(sizeof(Node));
s->data = x;
s->next = pre->next;
pre->next = s;
}
int main() {
LinkList L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *p, *s;
int n, x;
printf("请输入链表长度:");
scanf("%d", &n);
printf("请输入链表元素:");
for (int i = 0; i < n; i++) {
s = (Node *)malloc(sizeof(Node));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
}
printf("请输入要插入的元素:");
scanf("%d", &x);
insert(L, x);
printf("插入后的链表为:");
p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
```
测试数据:
输入:
```
请输入链表长度:5
请输入链表元素:1 3 5 7 9
请输入要插入的元素:6
```
输出:
```
插入后的链表为:1 3 5 6 7 9
```
阅读全文