데이터 구조 - 증분 체인 두 세트의 차분 2.4 연습

1. 문제 설명

  • 알려진 두리스트 L1 및 L2는 그 요소가 상승 된 두 세트를 나타낸다. 두 세트를 획득하기 위해 L1 및 L2 차 집합 (즉, 요소의 집합으로 L1 나타나지 만이 L2 발생을 구성)과 동일한 형태로 저장하고, 일련의 요소의 수를 반환 알고리즘을 설계주세요 .

2. 주제 분석

  • 두 집합 A와 B가 설정되어있는 차이를 찾는 것은에서 공통 요소 B 삭제를 의미하는 것으로, 즉, 링크리스트에 대응하는 노드를 삭제하는, 상기 전구체는 노드는 선행 노드 프리 포인터 포인트 저장 삭제할 . P1 및 P2는 L1이고 L2 작업리스트 포인터는 L1과 L2가 모두 표 엔드 노드에 도달 할 때 때 첫 번째 노드가 두 개의리스트를 비교로부터 시작하여, 각각의 링크 된리스트의 제 1 노드에 초기화 테이블 L1 요소 테이블 엘리먼트 L2보다 작은 경우, 미리 설정된 현재 노드 포인터가 이동 한 후,이 테이블 포인터 P1 L1 테이블을 작동 N ++ (N 세트의 차이 세트 요소들의 수를 나타낸다)와; L2 나타난 경우 원소 L1이 L2 작동 포인터 이동 후의 테이블의 요소보다 작다. 남녀 공통 노드 (L1)를 제거합니다. (여기서 L1 결과 세트의 차이를 저장)
// 链表差集
void Difference(LinkList &L1, LinkList &L2, int &n)  // 差集的结果存储于单链表L1中,n是结果集合中元素个数,调用时为0
{
	LNode *p1, *p2, *pre, *u;
	p1 = L1->next;
	p2 = L2->next;  // p1和p2分别是链表L1和L2的工作指针,初始化为相应链表的第一个结点
	pre = L1;     // pre为L1中pa所指结点的前驱结点的指针

	while (p1&&p2)
	{
		if (p1->data < p2->data)
		{
			pre = p1;
			p1 = p1->next;
			n++;    // A链表中当前结点指针后移
		}        
		else if (p1->data > p2->data)
			p2 = p2->next;
		else
		{
			pre->next = p1->next;     // 处理A,B中元素值相同的结点,应删除
			u = p1;
			p1 = p1->next;
			delete u;     // 删除结点
		}
	}
}

3. 코드 구현

  • MAIN.CPP
#include <iostream>

using namespace std;

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

int InitList(LinkList &L)
{
	L = new LNode;
	L->next = NULL;
	return 1;
}

void TraveList(LinkList L)
{
	LNode *p;
	p = L->next;

	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

// 尾插法建立链表
void CreateList(LinkList &L, int n)
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	for (int i = 0; i < n; i++)
	{
		printf("请输入链表第%d个元素的值:", i + 1);
		LNode *s;
		s = new LNode;
		scanf("%d", &s->data);
		s->next = NULL;
		r->next = s;
		r = s;
	}
}

// 链表差集
void Difference(LinkList &L1, LinkList &L2, int &n)  // 差集的结果存储于单链表L1中,n是结果集合中元素个数,调用时为0
{
	LNode *p1, *p2, *pre, *u;
	p1 = L1->next;
	p2 = L2->next;  // p1和p2分别是链表L1和L2的工作指针,初始化为相应链表的第一个结点
	pre = L1;     // pre为L1中pa所指结点的前驱结点的指针

	while (p1&&p2)
	{
		if (p1->data < p2->data)
		{
			pre = p1;
			p1 = p1->next;
			n++;    // A链表中当前结点指针后移
		}        
		else if (p1->data > p2->data)
			p2 = p2->next;
		else
		{
			pre->next = p1->next;     // 处理A,B中元素值相同的结点,应删除
			u = p1;
			p1 = p1->next;
			delete u;     // 删除结点
		}
	}
}
	
int main()
{
	LinkList L1, L2;

	if (InitList(L1))
	{
		printf("L1初始化成功!\n");
	}
	else
	{
		printf("L1初始化失败!\n");
	}

	if (InitList(L2))
	{
		printf("L2初始化成功!\n");
	}
	else
	{
		printf("L2初始化失败!\n");
	}

	printf("请输入L1的长度:");
	int n1;
	scanf("%d", &n1);
	CreateList(L1, n1);
	TraveList(L1);

	printf("请输入L2的长度:");
	int n2;
	scanf("%d", &n2);
	CreateList(L2, n2);
	TraveList(L2);

	int n = 0;
	Difference(L1, L2, n);
	printf("链表差集:\n");
	TraveList(L1);
	printf("链表中元素个数为:%d\n", n);

	system("pause");

	return 0;
}
  • 영업 실적

추천

출처blog.csdn.net/qq_22847457/article/details/94163450