C语言单链表的创建反转与合并

C语言单链表的创建反转与合并,第1张

C语言单链表的创建反转与合并
//不采用封装的单链表
#include
#include
#include
#include
typedef int DATA;

typedef struct Node                              //创建节点的结构
{
	DATA data;
	struct Node *next;
}NODE ,*LPNODE;

LPNODE createList()                               //创建初始化链表的模板
{
	LPNODE HeadNode = (LPNODE)malloc(sizeof(NODE));//创建头节点
	assert(HeadNode);                              //判定是否创建成功,不成功则assert函数结束程序抛出异常位置
	HeadNode->next = NULL;                         //头节点下一个置空
	return HeadNode;                               //返回头节点地址
}

LPNODE createNode(DATA data)                      //创建节点的模型
{
	LPNODE newNode = (LPNODE)malloc(sizeof(NODE));//创建节点
	assert(newNode);                              //对节点属性的 *** 作
	newNode->data = data;
	newNode->next = NULL;
	return newNode;                               //返回节点地址
}

void printfList(struct Node * list)
{
	LPNODE pmove = list->next;                   //建立临时指针指向头节点地址 
	while (pmove != NULL)
	{
		printf("%dt",pmove->data);              //输出节点的数据
		pmove = pmove->next;                     //指针后移
	}
	printf("n");
}

void push_sort(struct Node * list, DATA data)     //入栈
{
	LPNODE newNode = createNode(data);
	LPNODE pronode = list;
	LPNODE curNode = list->next;
	while (curNode != NULL&&curNode->data <= data)
	{
		pronode = curNode;
		curNode = curNode->next;
	}
	if (curNode == NULL&&pronode == list)
	{
		list->next = newNode;                  //头插法,不断将list->next指向现在的新节点
	}
	else if (curNode == NULL&&pronode != list)
	{
		proNode->next = newNode;
	}
	else
	{
		proNode->next = newNode;
		newNode->next = curNode;
	}
}

void reverse(LPNODE list)              //反转
{
	//链表空,或者只有一个节点
	if (list == NULL||list->next == NULL || list->next->next == NULL)
	{
		return;
	}
	LPNODE pronode = NULL;
	LPNODE curNode = list->next;                   //curNode指向现在的节点
	LPNODE surList = curNode->next;                //surList指向现节点的下一个节点
	while (surList != NULL)
	{
		//当前节点的下一个节点的值置为临时指针的值,临时指针的值修改为当前节点的值
		curNode->next = proNode;                   
		pronode = curNode;          

		//当前节点的值修改为当前节点下一个的值surNodew,surNode再次获取新的当前节点下一个的值
 		curNode = surList;                         
		surList = curNode->next;
	}
	//当前节点下一个的值修改为临时指针存放的之前的当前节点的值
	curNode->next = proNode;
	list->next = curNode;
}

void mergeList(LPNODE list1, LPNODE list2)
{
	LPNODE pmove = list2->next;
	while (pmove != NULL)
	{
		push_sort(list1, pmove->data);//将list2的数据插入list1,当有序链表进行合并等,链表会进行自动冒泡排序
		pmove = pmove->next;
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	LPNODE list = createList();
	for (int i = 0; i <= 10; i++)
	{
		push_sort(list, rand()%100);
	}
	printfList(list);

	reverse(list);
	printfList(list);

	LPNODE list1 = createList();
	push_sort(list1, 7);
	push_sort(list1, 5);
	push_sort(list1, 3);
	LPNODE list2 = createList();
	push_sort(list2, 2);
	push_sort(list2, 4);
	push_sort(list2, 6);
	mergeList(list1, list2);
	printfList(list1);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5715091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存