编写c语言程序,输入若干正整数,按从小到大次序建立1个带头结点单链表,设计一个实现单链表分离算法的Split函数,将原单链表中值为偶数的结点分离出来形成一个新单链表,新单链表中头结点重新申请,其余结点来自原链表,分离后,原链表中只剩非偶数值所在结点,最后显示2个单链表,在程序退出前销毁单链表。要求Split算法时间复杂性达到O(n),程序不可存在内存泄漏。 输入格式: 若干正整数。 输出格式: 每个单链表输出占一行,元素间用分隔符->分隔;初始单链表、剩余元素单链表、偶数元素单链表,共3行。 输入样例: 100 2 3 50 2 1 5 8 输出样例: 1->2->2->3->5->8->50->100 1->3->5 2->2->8->50->100
时间: 2023-08-07 12:42:59 浏览: 212
带头结点的单链表的c算法实现
以下是实现题目要求的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node, *LinkedList;
void CreateList(LinkedList L, int n); // 建立单链表
void Split(LinkedList L, LinkedList L1, LinkedList L2); // 单链表分离
void PrintList(LinkedList L); // 输出单链表
void DestroyList(LinkedList L); // 销毁单链表
int main() {
LinkedList L = (LinkedList)malloc(sizeof(Node)); // 头结点
L->next = NULL;
int n;
scanf("%d", &n);
CreateList(L, n); // 建立单链表
LinkedList L1 = (LinkedList)malloc(sizeof(Node)); // 头结点
L1->next = NULL;
LinkedList L2 = (LinkedList)malloc(sizeof(Node)); // 头结点
L2->next = NULL;
Split(L, L1, L2); // 单链表分离
PrintList(L); // 输出初始单链表
PrintList(L1); // 输出剩余元素单链表
PrintList(L2); // 输出偶数元素单链表
DestroyList(L); // 销毁单链表
DestroyList(L1); // 销毁单链表
DestroyList(L2); // 销毁单链表
return 0;
}
void CreateList(LinkedList L, int n) {
for(int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
LinkedList p = L;
while(p->next != NULL && p->next->data < x) {
p = p->next;
}
LinkedList q = (LinkedList)malloc(sizeof(Node));
q->data = x;
q->next = p->next;
p->next = q;
}
}
void Split(LinkedList L, LinkedList L1, LinkedList L2) {
LinkedList p = L->next;
while(p != NULL) {
if(p->data % 2 == 0) { // 偶数
LinkedList q = p;
p = p->next;
q->next = L2->next;
L2->next = q;
} else { // 奇数
LinkedList q = p;
p = p->next;
q->next = L1->next;
L1->next = q;
}
}
}
void PrintList(LinkedList L) {
LinkedList p = L->next;
while(p != NULL) {
printf("%d", p->data);
if(p->next != NULL) {
printf("->");
}
p = p->next;
}
printf("\n");
}
void DestroyList(LinkedList L) {
LinkedList p = L->next;
while(p != NULL) {
LinkedList q = p;
p = p->next;
free(q);
}
L->next = NULL;
}
```
阅读全文