设已知线性表中的元素(整数)以值递增有序排列,并以单链表作为存储结构。请用C语言写一个高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析算法的时间复杂度(注意,mink和maxk是给定的两个参变量,它们的值为任意整数),并给出运行结果,其中输入内容可以随机
时间: 2023-12-18 11:02:52 浏览: 143
算法思路:
1. 定义两个指针:pre和p,初始化pre指向头结点,p指向第一个元素;
2. 遍历链表,当p所指元素的值大于mink且小于maxk时,删除该元素,并将p指向下一个元素,pre不变;
3. 当p所指元素的值小于等于mink或大于等于maxk时,pre和p都指向下一个元素;
4. 重复执行步骤2和步骤3,直到p指向尾结点为止。
时间复杂度:O(n),其中n为链表长度。
C语言代码实现如下:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
// 初始化链表
void InitList(LinkList *L) {
*L = (Node*)malloc(sizeof(Node));
(*L)->next = NULL;
}
// 在链表末尾插入元素
void InsertTail(LinkList L, int x) {
Node *p = (Node*)malloc(sizeof(Node));
p->data = x;
p->next = NULL;
Node *q = L;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
// 删除大于mink且小于maxk的元素
void DeleteRange(LinkList L, int mink, int maxk) {
Node *pre = L;
Node *p = L->next;
while (p != NULL) {
if (p->data > mink && p->data < maxk) {
pre->next = p->next;
free(p);
p = pre->next;
} else {
pre = p;
p = p->next;
}
}
}
// 输出链表元素
void PrintList(LinkList L) {
Node *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L;
InitList(&L);
int i;
for (i = 1; i <= 10; i++) {
InsertTail(L, i);
}
printf("原始链表:");
PrintList(L);
DeleteRange(L, 3, 8);
printf("删除大于3且小于8的元素后的链表:");
PrintList(L);
return 0;
}
```
运行结果:
```
原始链表:1 2 3 4 5 6 7 8 9 10
删除大于3且小于8的元素后的链表:1 2 8 9 10
```
阅读全文