2.4、求顺序表中的最大值和次大值
2.5、元素 x 插入递增有序的顺序表
2.6、合并两个递增顺序表 / 单链表
2.7、求俩递增单链表的交集单链表
简化版:
/************************************************************
* Windows 10下,Dev-C++ 6.6、Visual Studio 2019 中测试通过 *
* *
* @file 习题2.7.c *
* *
* @brief 习题2.7 *
* 设有两个线性表 A 和 B,皆是单链表存储结构。 *
* 同一个表中的数据元素各不相同,且递增有序。 *
* 编写算法,构成一个新的线性表 C,使 C 成为 *
* A 和 B 的交集,且 C 中数据元素也递增有序。 *
* *
* @author CSDN@洛必不达法则 *
* *
* @date 2021-10-17 *
*************************************************************/
#define _CRT_SECURE_NO_WARNINGS // VS2019中 scanf 被认为是不安全的,需要加上该宏才能使用
#include <stdio.h>
#include <stdlib.h>
/**
* @brief 定义链表节点结构体
*/
typedef struct node
{
int data; // 节点数据
struct node* next; // 后继指针
}LNode, LList, * LPList;
/**
* @brief 创建链表节点
* @param nData 节点数据
* @return 创建成功的节点的地址
*/
LNode* CreateNode(int nData)
{
LNode* pNode = (LNode*)malloc(sizeof(LNode));
if (!pNode)
{
printf("内存申请失败!\n");
return NULL;
}
pNode->next = NULL;
pNode->data = nData;
return pNode;
}
/**
* @brief 创建链表
* @return 创建的链表的头节点的地址
*/
LPList CreateList()
{
LNode* pHead = CreateNode(-12345);
LNode* pTail = pHead;
int nodeData = 0;
// 输入非数字时结束循环
while (scanf("%d", &nodeData))
{
LNode* pNode = CreateNode(nodeData);
pTail->next = pNode;
pTail = pNode;
}
return pHead;
}
/**
* @brief 遍历打印链表数据
* @param lpList 需要遍历的链表
*/
void PrintList(LPList lpList)
{
LNode* pMove = lpList->next;
while (pMove != NULL)
{
printf("%d ", pMove->data);
pMove = pMove->next;
}
printf("\n");
}
/**
* @brief 求两个链表的交集,交集仍为递增链表,且不破坏原先的两个链表
* @param lListA 待求的链表A
* @param lListB 待求的链表B
* @return 求交集后的递增链表
*/
LPList IntersectList(LList lListA, LList lListB)
{
LNode* pHead = CreateNode(-12345);
LNode* pTail = pHead;
LNode* pMoveA = lListA.next;
LNode* pMoveB = lListB.next;
while (pMoveA != NULL)
{
while (pMoveB != NULL)
{
/* pMoveB->data != pTail->data || pTail == pHead
* 这是为了防止节点数据等于头节点里的那个数据(-12345)
*/
if (pMoveA->data == pMoveB->data && (pMoveB->data != pTail->data || pTail == pHead))
{
pTail->next = pMoveB;
pTail = pMoveB;
}
else if(pMoveB->data > pMoveA->data)
{
break;
}
pMoveB = pMoveB->next;
}
pMoveA = pMoveA->next;
}
pTail->next = NULL;
return pHead;
}
int main()
{
printf("\t********* 习题2.7 *********\n");
printf("递增输入链表 A 节点数据,各个数据互不相等(输入任意字母字符结束):\n");
LPList A = CreateList();
setbuf(stdin, NULL);
printf("\n递增输入链表 B 节点数据,各个数据互不相等(输入任意字母字符结束):\n");
LPList B = CreateList();
printf("\n链表 A:\n");
PrintList(A);
printf("链表 B:\n");
PrintList(B);
LPList C = IntersectList(*A, *B);
printf("\n合并后链表 C:\n");
PrintList(C);
return 0;
}