C語言 兩個有序鏈表序列的交集

這個算法的思路是兩個指針分別指向兩個鏈表頭,然後才頭到尾遍歷,複雜度是O(min(Length(a),Length(b)),下面給出實現代碼,是用純C寫的鏈表實現,注意代碼中直接採用尾插法最後一個數據會超時,因爲鏈表尾插的時間複雜度是O(N),解決的辦法是創建一個尾節點

#include <stdio.h>
#include <stdlib.h>

#define ERROR NULL
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
	ElementType Data;
	PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

List MakeEmpty();
Position Find(List L, ElementType X);
bool Insert(List L, ElementType X, Position P);
bool Delete(List L, Position P);
void InsertTail(List L, ElementType X);

int main()
{
	List L1 = MakeEmpty();
	List L2 = MakeEmpty();
	List L3 = MakeEmpty();
	int temp;
	while (1)
	{
		scanf_s("%d", &temp);
		if (temp == -1)
			break;
		InsertTail(L1, temp);
	}
	while (1)
	{
		scanf_s("%d", &temp);
		if (temp == -1)
			break;
		InsertTail(L2, temp);
	}
	PtrToLNode p, q;
	p = L1->Next;
	q = L2->Next;
	while (p&&q)
	{
		if (p->Data == q->Data)
		{
			InsertTail(L3, p->Data);
			p = p->Next;
			q = q->Next;
		}
		else if (p->Data > q->Data)
		{
			q = q->Next;
		}
		else if (p->Data < q->Data)
		{
			p = p->Next;
		}
	}
	p = L3->Next;
	if (p == NULL)
		printf("NULL\n");
	else
	{
		printf("%d", p->Data);
		while (p)
		{
			p = p->Next;
			if(p)
				printf(" %d", p->Data);
		}
	}
		
}

List MakeEmpty()
{
	List L = (List)malloc(sizeof(struct LNode));
	L->Next = NULL;
	return L;
}

Position Find(List L, ElementType X)
{
	PtrToLNode p;
	p = L->Next;
	while (p)
	{
		if (p->Data == X)
			return p;

		p = p->Next;
	}
	return p;
}

bool Insert(List L, ElementType X, Position P)
{
	PtrToLNode p, temp;
	p = L;
	while (p&&p->Next != P)
	{
		p = p->Next;
	}
	if (p == NULL)
	{
		printf("Wrong Position for Insertion\n");
		return false;
	}

	temp = (PtrToLNode)malloc(sizeof(struct LNode));
	temp->Data = X;
	temp->Next = p->Next;
	p->Next = temp;
	return true;
}

bool Delete(List L, Position P)
{
	PtrToLNode p, temp;
	p = L;
	while (p&&p->Next != P)
	{
		p = p->Next;
	}
	if (p == NULL)
	{
		printf("Wrong Position for Deletion\n");
		return false;
	}

	temp = p->Next;
	p->Next = temp->Next;
	free(temp);
	return true;
}

void InsertTail(List L, ElementType X)
{
	PtrToLNode p, temp;
	p = L;
	while (p->Next)
	{
		p = p->Next;
	}
	temp = (PtrToLNode)malloc(sizeof(struct LNode));
	temp->Data = X;
	temp->Next = NULL;
	p->Next = temp;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章