严蔚敏数据结构C语言版 P31 算法2.11
两个有序链表并为一个有序链表(用户自己输入有序的链表!)(功能体系较为完善建议认真理解本程序)
/*
严蔚敏数据结构C语言版 P31 算法2.11
两个有序链表并为一个有序链表(用户自己输入有序的链表!)(功能体系较为完善建议认真理解本程序)
*/
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//宏区
#define List_length 5 //可一次性修改需要开辟的个数(注意,要把下面一个宏定义的数值改为List_length的两倍(两个链表))
#define List_MAX 10 //第三个链表的结点数
//结构
typedef struct List //该单链表的结构
{
int data; //数据域
struct List *NEXT; //指针域
}Sqlist,*PList;
//函数声明
PList List_initialize(void); //初始化链表,并返回头指针
void List_valuation(PList); //由用户自定义开辟的结点数并赋予每个结点的值
void List_printf(PList); //输出链表的值
void List_establish(PList); //建立链表但数据域不赋予值
void List_Orderly_merge(PList, PList, PList); //两个有序链表并为一个有序链表
//函数区
PList List_initialize(void) //初始化链表,并返回头指针
{
PList PHead = (PList)malloc(sizeof(Sqlist)); //开辟头结点并用头指针指向
if (NULL == PHead) //判断是否开辟成功
{
printf("初始化链表头结点开辟失败,检查程序\n"); //显示出错位置,方便查找
exit(1); //非正常退出程序
}
PHead->NEXT = NULL; //将头结点的指针域挂起
return PHead; //返回头指针
}
void List_valuation(PList PHead) //由题意默认开辟五个结点数并赋予每个结点的值
{
PList PTail = NULL; //用于临时操作的移动指针
PList PNEW = NULL; //用于开辟新结点的头指针
int i, len, val;
PTail = PHead; //将头指针的权限交给PTail
for (i = 1;i <= List_length;i++) //建立链表
{
printf("输入第%d个结点的值:", i); //提醒用户的操作
scanf_s("%d", &val); //输入数据
PNEW = (PList)malloc(sizeof(Sqlist)); //用头指针指向新开辟的结点
if (NULL == PNEW) //判断是否开辟成功
{
printf("用户赋值初始化时,开辟新结点失败,检查程序"); //显示出错位置,方便查找
exit(1); //非正常退出程序
}
PNEW->data = val; //将用户输入的数据赋给新结点
PNEW->NEXT = NULL; //使新结点的指针域挂起
PTail->NEXT = PNEW; //将新结点的上一个结点指向新结点
while (PTail->data > PTail->NEXT->data) //如果用户输入的不是有序链表,则重新输入值
{
printf("输入的不是有序链表,重新输入!\n");