3.4(题目中两个链表均以升序排列)
#include<stdio.h>
#include<malloc.h>
/* 用链表实现, 假定每一个输入链表都没有相同元素 */
typedef struct node
{
int data;
struct node* pNext;
}Node, * PtrNode;
PtrNode MakeList(void); //创建链表,返回头节点
void ShowList(PtrNode pHead); //打印链表中的数据
PtrNode Intersect(PtrNode L1, PtrNode L2);//求L1和L2的交集
PtrNode NewNode(PtrNode pTail, int val); //在一个链表末端生成新的节点
int main(void)
{
PtrNode L1 = MakeList();
PtrNode L2 = MakeList();
PtrNode L = Intersect(L1, L2);
ShowList(L);
return 0;
}
PtrNode NewNode(PtrNode pTail, int val)//在一个链表末端生成新的节点
{
PtrNode pNew = (PtrNode)malloc(sizeof(Node));
pNew->data = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
return pTail;
}
PtrNode MakeList(void)
{
int Size;
printf("请输入链表的长度:");
scanf_s("%d", &Size);
PtrNode pHead = (PtrNode)malloc(sizeof(Node));//创建链表L的头节点
PtrNode pTail = pHead;
pTail->pNext = NULL;
int temp;
for (int i = 0; i < Size; i++)
{
printf("请输入链表的第%d个元素:", i + 1);
scanf_s("%d", &temp);
pTail = NewNode(pTail, temp);
}
printf("\n");
return pHead;
}
void ShowList(PtrNode pHead)
{
PtrNode p = pHead->pNext;
if (p == NULL)
{
printf("链表为空!\n");
return;
}
while (p != NULL)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
PtrNode Intersect(PtrNode L1, PtrNode L2)
{
PtrNode p = L1->pNext; //用来遍历链表1
PtrNode q = L2->pNext; //用来遍历链表2
PtrNode pIntersect = (PtrNode)malloc(sizeof(Node));//创建交集的头节点
PtrNode pTail = pIntersect;
pTail->pNext = NULL;
while (p != NULL && q != NULL)
{
while (p != NULL && q != NULL && p->data < q->data) //如果p指向的元素小于q指向的元素,p向前移动
p = p->pNext;
while (p != NULL && q != NULL && (p->data) > q->data)//如果p指向的元素大于q指向的元素,q向前移动
q = q->pNext;
//上面两个循环停止时,如果没有移动到链表末端,则判断是否为相同元素
while (p != NULL && q != NULL && p->data ==q->data)
{
pTail = NewNode(pTail, p->data);
p = p->pNext;//存入元素后,移动指针
q = q->pNext;
}
}
return pIntersect;
}
3.5(题目中两个链表均以升序排列)
#include<stdio.h>
#include<malloc.h>
/* 用链表实现, 假定每一个输入链表都没有相同元素 */
typedef struct node
{
int data;
struct node* pNext;
}Node, * PtrNode;
PtrNode MakeList(void); //创建链表,返回头节点
void ShowList(PtrNode pHead); //打印链表中的数据
PtrNode NewNode(PtrNode pTail, int val); //在一个链表末端生成新的节点
PtrNode Union(PtrNode L1, PtrNode L2);//求L1和L2的并集
int main(void)
{
PtrNode L1 = MakeList();
PtrNode L2 = MakeList();
PtrNode L = Union(L1, L2);
ShowList(L);
return 0;
}
PtrNode NewNode(PtrNode pTail, int val)//在一个链表末端生成新的节点
{
PtrNode pNew = (PtrNode)malloc(sizeof(Node));
pNew->data = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
return pTail;
}
PtrNode MakeList(void)
{
int Size;
printf("请输入链表的长度:");
scanf_s("%d", &Size);
PtrNode pHead = (PtrNode)malloc(sizeof(Node));//创建链表L的头节点
PtrNode pTail = pHead;
pTail->pNext = NULL;
int temp;
for (int i = 0; i < Size; i++)
{
printf("请输入链表的第%d个元素:", i + 1);
scanf_s("%d", &temp);
pTail = NewNode(pTail, temp);
}
printf("\n");
return pHead;
}
void ShowList(PtrNode pHead)
{
PtrNode p = pHead->pNext;
if (p == NULL)
{
printf("链表为空!\n");
return;
}
while (p != NULL)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
PtrNode Union(PtrNode L1, PtrNode L2)
{
PtrNode p = L1->pNext; //用来遍历链表1
PtrNode q = L2->pNext; //用来遍历链表2
PtrNode pUnion = (PtrNode)malloc(sizeof(Node));//创建交集的头节点
PtrNode pTail = pUnion;
pTail->pNext = NULL;
while (p != NULL && q != NULL)
{
/*优先将小的元素存入链表*/
while (p != NULL && q != NULL && p->data < q->data) //如果p指向的元素小于q指向的元素,p向前移动
{
pTail = NewNode(pTail, p->data);
p = p->pNext;
}
while (p != NULL && q != NULL && (p->data) > q->data)//如果p指向的元素大于q指向的元素,q向前移动
{
pTail = NewNode(pTail, q->data);
q = q->pNext;
}
//上面两个循环停止时,如果没有移动到链表末端,则判断是否为相同元素
while (p != NULL && q != NULL && p->data == q->data)
{
pTail = NewNode(pTail, p->data);
p = p->pNext;//存入元素后,移动指针
q = q->pNext;
}
}
if (p == NULL) //p移动到末端 或 L1为空,并集为L2
{
while (q != NULL)
{
pTail = NewNode(pTail, q->data);
q = q->pNext;
}
}
if (p == NULL) //q移动到末端 或 L2为空,并集为L1
{
while (p != NULL)
{
pTail = NewNode(pTail, p->data);
p = p->pNext;
}
}
return pUnion;
}