分数 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 Sort(List L);//单链表排序
void Display(List L);//输出单链表
void 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) {//大于0的添加到一个正数链表中
List L = CreatHead();//创建一个新结点
L->Data = v;//将v的值赋给L的Data
firstTail->Next = L;//让正数链表的尾巴指针的Next域指向新结点
firstTail = L;//尾指针指向新结点
}
else {//小于0的添加到另外一个负数链表中
List L = CreatHead();
L->Data = v;
secondTail->Next = L;
secondTail = L;
}
}
Sort(firstHead);//单链表排序
Sort(secondHead);
Display(firstHead);//输出单链表
Display(secondHead);
Destroy(firstHead);//销毁单链表
Destroy(secondHead);
}
List CreatHead() {
List p = (List)malloc(sizeof(LinkList)); //向内存申请一片空间
if (p == NULL) {
exit(EXIT_FAILURE); // 分配失败时退出
}
p->Next = NULL; //新结点的Next域指向NULL
return p; //返回p指针所指向的内存地址
}
void Display(List L) {
List p = L->Next; //定义一个p指针指向单链表的第一有效结点
while (p) { //如果单链表不为空
printf("%d", p->Data); //输出该结点的数据域
p = p->Next; //p指针沿着链表继续向后指
if (p) printf("->"); //如果该节点不为空则输出”->“
} //根据题目要求元素间用分隔符”->“分隔
printf("\n"); //最后输出换行符
}
void Destroy(List L) {
List p = L; //定义一个p指针指向该单链表
while (p->Next) { //如果p的Next域不为空,即下一个结点存在
List q = p->Next; //定义一个新的指针q指向需要删除的结点
p->Next = q->Next; //让头结点与需要删除结点的下一个结点链接
free(q); //释放需要删除结点的内存
}
free(p); //最后删除头结点
}
void Sort(List L) {//选择排序
List pStar, pcur,pMin;//定义三个List型指针变量
pStar = L->Next;//pStar用于指向每次外循环的第一个结点
int temp;//定义一个零时变量,用于交换Data,注意单链表的排序改变链表顺序,只交换数据域
for (;pStar != NULL;pStar = pStar->Next) {//外循环,遍历整个单链表
pMin = pStar;//假设链表中最小的值就是pStar
for (pcur = pMin->Next;pcur != NULL; pcur = pcur->Next) {//内循环,在篇Star后结点中找最小的数据
if (pcur->Data < pMin->Data) {//如果后面结点的数据比pMin小,则将其赋值给pMin
pMin = pcur;
}
}
if (pStar != pMin) {//交换两结点的数据域
temp = pMin->Data;
pMin->Data = pStar->Data;
pStar->Data = temp;
}//如果pMin的地址与pStar的相等则不需要进行交换
}
}