数据结构NOJ——05单链表的删除

数据结构NOJ——05单链表的删除_第1张图片

#include
using namespace std;

typedef int ElemType;

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

void Create_LinkList(LinkList& L,int n) {
	L = new LNode;
	L->next = NULL;
	LNode* r;
	r = L;
	for (int i = 0; i < n; i++) {
		LNode* p;
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

void FindSame(LinkList& B, LinkList C,LinkList &L) {
	LNode* p,*q,*temp;
	L = temp = B;//这里要注意L=B,再设指针,不然会改变p->next的值
	p = B->next;
	q = C->next;
	while (p && q) {
		if (p->data == q->data) {
			temp->next = p;
			temp = p;
			p = p->next;  
			q = q->next;
		}
		else if (p->data < q->data)
			p = p->next;
		else
			q = q->next;
	}
}

//这里的关于单链表删除的技巧
void Delect(LinkList B, LinkList& A) {
	LNode* pa, * qa, * pb, * temp;
	qa = A;
	pa = A->next; // pa 为 qa 的直接后继节点
	pb = B->next;
	while (pa && pb) {
		if (pa->data == pb->data) {
			temp = pa;
			pa = pa->next;
			qa->next = pa;
			pb = pb->next;
			free(temp);
		}
		else if (pa->data < pb->data) {
			pa = pa->next;
			qa = qa->next;
		}
		else
			pb = pb->next;
	}
}

void Show(LinkList L) {
	LNode* p;
	p = L->next;
	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
}

void main() {
	LinkList A, B, C,L;
	int a, b, c;
	cin >> a >> b >> c;
	Create_LinkList(A, a);
	Create_LinkList(B, b);
	Create_LinkList(C, c);
	FindSame(B, C,L);
	Delect(L, A);
	Show(A);
}

你可能感兴趣的:(数据结构)