静态链表求并集(C语言实现)

        对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。此处就是利用静态链表实现并集的基本操作:

void Unionnode(Node L1[], Node L2[], Node L3[], int num1, int num2)
{
	int i = 0;
	int j = 0;
	int jug = 0;
	int k = 0;
	Initnode(L3);
	for (i = 2; i < num2 + 2;i++)
	{
		L3[i].cur = L2[i].cur;
		L3[i].data = L2[i].data;
	}
	L3[0].cur = num2 + 2;
	k = L3[0].cur;
	for (i = 2; i < num1 + 2; i++)
	{
		jug = 0;
		for (j = 2; j < num2 + 2; j++)
		{
			if (L1[i].data == L2[j].data)
			{
				break;
			}
			jug++;
		}
		if (jug == num2)
		{
			L3[k].data = L1[i].data;
			k = L3[k].cur;

		}

	}

			L3[k - 1].cur = 0;
			L3[num2 + 1].cur = num2 + 2;
}

全部代码如下:

#include<stdio.h>
#define MAXSIZE 100


typedef struct Node
{
	int data;
	int cur;
}Node;

//静态链表初始化
void Initnode(Node L[])
{
	int i = 0;
	for (i = 1; i < MAXSIZE; i++)
	{
		L[i].cur = i + 1;
	}
	L[MAXSIZE - 1].cur = 0;
	L[0].cur = -1;

}

//在静态链表中直接插入元素
void Setnode(Node L[], int num)
{
	int a = 0;
	int i = 0;
	printf("请依次输入链表中的元素:\n");
	for (i = 1; i < num + 1; i++)
	{
		a = L[i].cur;
		scanf("%d", &L[a].data);
	}
	L[num + 1].cur = 0;
	L[0].cur = num + 2;
}


//遍历静态链表
void Printnode(Node L[])
{
	int i = 1;
	printf("两者的并集为:");
	while (L[i].cur)
	{
		i = L[i].cur;
		printf("  %d", L[i].data);
		
	}
}

//两个静态链表求并集
void Unionnode(Node L1[], Node L2[], Node L3[], int num1, int num2)
{
	int i = 0;
	int j = 0;
	int jug = 0;
	int k = 0;
	Initnode(L3);
	for (i = 2; i < num2 + 2;i++)
	{
		L3[i].cur = L2[i].cur;
		L3[i].data = L2[i].data;
	}
	L3[0].cur = num2 + 2;
	k = L3[0].cur;
	for (i = 2; i < num1 + 2; i++)
	{
		jug = 0;
		for (j = 2; j < num2 + 2; j++)
		{
			if (L1[i].data == L2[j].data)
			{
				break;
			}
			jug++;
		}
		if (jug == num2)
		{
			L3[k].data = L1[i].data;
			k = L3[k].cur;

		}

	}
			L3[k - 1].cur = 0;
			L3[num2 + 1].cur = num2 + 2;
	
}


int main()
{
	int i = 0;
	Node L1[MAXSIZE], L2[MAXSIZE], L3[MAXSIZE];
	int num1 = 0;
	int num2 = 0;
	printf("*********静态链表求并集*********\n");
	Initnode(L1);
	Initnode(L2);
	printf("请输入创建链表1的元素个数:\n");
	scanf("%d", &num1);
	Setnode(L1, num1);
	printf("请输入创建链表2的元素个数:\n");
	scanf("%d", &num2);
	Setnode(L2, num2);
	Unionnode(L1, L2,L3,num1, num2);
	Printnode(L3);


}


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用C语言实现链表并集的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct Node { int data; struct Node* next; }; // 插入节点到链表尾部 void insert(struct Node** head, int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; if (*head == NULL) { *head = newNode; } else { struct Node* current = *head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } // 打印链表 void printList(struct Node* head) { struct Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } // 合并两个有序链表 struct Node* mergeLists(struct Node* list1, struct Node* list2) { struct Node* result = NULL; struct Node* current = NULL; while (list1 != NULL && list2 != NULL) { if (list1->data < list2->data) { if (result == NULL) { result = current = list1; } else { current->next = list1; current = current->next; } list1 = list1->next; } else { if (result == NULL) { result = current = list2; } else { current->next = list2; current = current->next; } list2 = list2->next; } } if (list1 != NULL) { if (result == NULL) { result = list1; } else { current->next = list1; } } if (list2 != NULL) { if (result == NULL) { result = list2; } else { current->next = list2; } } return result; } int main() { // 创建链表1: 1->2->3 struct Node* list1 = NULL; insert(&list1, 1); insert(&list1, 2); insert(&list1, 3); // 创建链表2: 2->3->5 struct Node* list2 = NULL; insert(&list2, 2); insert(&list2, 3); insert(&list2, 5); // 合并链表并打印结果 struct Node* mergedList = mergeLists(list1, list2); printList(mergedList); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值