分数 5
作者 李卫明
单位 杭州电子科技大学
1.1编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。
输入格式:
若干整数。
输出格式:
每行显示一个链表,元素间用分隔符->分隔;共两行
输入样例:
100 2 3 -2 -8 -6 -9 -10 50 2 -1
输出样例:
2->2->3->50->100
-10->-9->-8->-6->-2->-1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
C程序如下:
#include<stdio.h>
#include<stdlib.h> // 定义链表结构体
typedef struct LinkList { int Data; // 节点数据 struct LinkList *Next; // 指向下一个节点的指针
} LinkList, *List; // 创建头节点的函数原型
List CreatHead();
// 显示链表的函数原型
void Display(List L);
// 销毁链表的函数原型
List Destroy(List L);
// 反转链表的函数原型(但此函数在代码中并未实现)
void Reverse(List L); int main() { // 定义两个链表的头尾指针 List firstHead, firstTail, secondHead, secondTail; // 创建两个链表的头节点 firstHead = CreatHead(); firstTail = firstHead; // 初始时,头尾指针指向同一个头节点 secondHead = CreatHead(); secondTail = secondHead; // 同上 int v; // 循环读取输入,直到文件结束 while (scanf("%d", &v) != EOF) { if (v > 0) { // 如果输入为正数,则添加到第一个链表 List L = CreatHead(); // 创建一个新的头节点(实际上应该只创建节点,而不是头节点) L->Data = v; firstTail->Next = L; // 将新节点添加到第一个链表的尾部 firstTail = L; // 更新第一个链表的尾指针 } else { // 如果输入为负数,则添加到第二个链表 List L = CreatHead(); // 同上,这里应该只创建节点 L->Data = v; secondTail->Next = L; // 将新节点添加到第二个链表的尾部 secondTail = L; // 更新第二个链表的尾指针 } } Sort(firstHead); Sort(secondHead); // 显示两个链表 Display(firstHead); Display(secondHead); // 销毁两个链表 Destroy(firstHead); Destroy(secondHead); return 0; // 返回0表示程序正常结束
} // 创建头节点的函数实现
List CreatHead() { List p = (List)malloc(sizeof(LinkList)); // 分配内存给新节点 if (p == NULL) { exit(EXIT_FAILURE); // 如果分配失败,则退出程序 } p->Next = NULL; // 初始化新节点的Next指针为NULL return p; // 返回新节点的指针
} // 显示链表的函数实现
void Display(List L) { List p = L->Next; // 从头节点的下一个节点开始遍历链表 while (p) { printf("%d", p->Data); // 打印当前节点的数据 p = p->Next; // 移动到下一个节点 if (p) printf("->"); // 如果下一个节点存在,则打印"->" } printf("\n"); // 打印换行符
} // 销毁链表的函数实现
List Destroy(List L) { List p = L; while (p->Next) { // 循环直到最后一个节点(不包括头节点) List q = p->Next; // 临时保存下一个节点的指针 p->Next = q->Next; // 将当前节点的Next指针指向下一个节点的下一个节点,跳过下一个节点 free(q); // 释放被跳过的节点的内存 } free(p); // 释放头节点的内存(虽然这在实际中可能不是必须的,因为头节点可能已经在其他地方被释放了) return NULL; // 销毁函数应该返回NULL,而不是L = NULL(这是无效的,因为L是传入函数的值的一个拷贝)
} void Sort(List L) {List pStar, pcur,pMin;pStar = L->Next;int temp;for (;pStar != NULL;pStar = pStar->Next) {pMin = pStar;for (pcur = pMin->Next;pcur != NULL; pcur = pcur->Next) {if (pcur->Data < pMin->Data) {pMin = pcur;}}if (pStar != pMin) {temp = pMin->Data;pMin->Data = pStar->Data;pStar->Data = temp;}}
}