分数 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的DatafirstTail->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域指向NULLreturn 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;//假设链表中最小的值就是pStarfor (pcur = pMin->Next;pcur != NULL; pcur = pcur->Next) {//内循环,在篇Star后结点中找最小的数据if (pcur->Data < pMin->Data) {//如果后面结点的数据比pMin小,则将其赋值给pMinpMin = pcur;}}if (pStar != pMin) {//交换两结点的数据域temp = pMin->Data;pMin->Data = pStar->Data;pStar->Data = temp;}//如果pMin的地址与pStar的相等则不需要进行交换}
}