目录
试编写一个算法,在带头结点链表L1中删除出现在带头结点链表L2中所有元素
Ha和Hb为两个带头结点链表的头指针,分别表示两个集合A和B,两个链表元素值递增有序。现要求零开辟空间构成一个新的带头结点链表,其头指针为Hc,链表的元素为AB的交集,且递增有序,试编写建立新链表的算法。
// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
struct Node {
int a;
struct Node *next;
};
//输出链表元素
void show(Node &head,string name) {
cout << "链表"<< name.c_str()<<":"<<endl;
Node * first;
first = head.next;
while (first != NULL) {
printf("%d ", first->a);
first = first->next;
}
cout << endl;
}
//抽取两个链表中的共同元素!
Node join(Node &Ha, Node &Hb) {
Node *pa;
pa = (Node*)malloc(sizeof(Node));
pa = Ha.next;
Node *pb;
pb = (Node*)malloc(sizeof(Node));
pb = Hb.next;
Node *pc;
pc = (Node*)malloc(sizeof(Node));
Node *r;
r = pc;
while(pa!=NULL&&pb!=NULL){
//扫描单链表HA,Hb
if (pa->a < pb->a) {
pa = pa->next;//当Ha中元素小于Hb中元素 Ha指针下移
}
else if (pa->a > pb->a) {
pb = pb->next;
}
else {
Node *H;
H = (Node*)malloc(sizeof(Node));
H->a=pa->a;
r->next = H;
r = H;
pa = pa->next;
pb = pb->next;
}
}
r->next = NULL;
return *pc;
}
int main()
{
//尾插法建立链表Ha,元素个数为5 元素为递增输入
Node *Ha;
Node *r;
Ha = (Node*)malloc(sizeof(Node));
r = Ha;
for (int i = 0; i < 5; i++) {
Node *H;
H = (Node*)malloc(sizeof(Node));
cin >> H->a;
r->next = H;
r = H;
}
r->next = NULL;
//尾插法建立链表Hb 元素个数为4 元素为递增输入
Node *Hb;
Hb = (Node*)malloc(sizeof(Node));
r = Hb;
for (int i = 0; i < 4; i++) {
Node *H;
H = (Node*)malloc(sizeof(Node));
cin >> H->a;
r->next = H;
r = H;
}
r->next = NULL;
//输出Ha链表中的元素
show(*Ha, "Ha");
//输出链表Hb中的元素
show(*Hb, "Hb");
//建立新链表的头结点
Node *Hc;
Hc = (Node*)malloc(sizeof(Node));
*Hc=join( *Ha, *Hb);
//输出Hc链表中的元素
show(*Hc, "Hc");
}
试编写一个算法,在带头结点链表L1中删除出现在带头结点链表L2中所有元素
// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
struct Node {
int a;
struct Node *next;
};
//输出链表元素
void show(Node &head, string name) {
cout << "链表" << name.c_str() << ":" << endl;
Node * first;
first = head.next;
while (first != NULL) {
printf("%d ", first->a);
first = first->next;
}
cout << endl;
}
//在带头结点的链表L1中删除出现在L2中的元素
void deleteNode(Node &L1,Node &L2) {
//两层循环,第一层循环,对L2进行循环,第二层循环对L1进行循环
Node *p;
Node *q;
Node *r; //删除结点
Node *h; //删除结点的钱指针
p = L2.next;
//外层循环
int i = 0;
while (p != NULL) {
h = &L1;
q = L1.next;
while (q!=NULL) {
if (q->a == p->a) {
r = q;
h->next = q->next;
q = q->next;
free(r);
}
else {
h = h->next;
q = q->next;
}
}
p = p->next;
}
}
int main()
{
//尾插法建立链表L1,元素个数为5 元素为递增输入
Node *Ha;
Node *r;
printf("请输入链表L1的5个元素:");
Ha = (Node*)malloc(sizeof(Node));
r = Ha;
for (int i = 0; i < 5; i++) {
Node *H;
H = (Node*)malloc(sizeof(Node));
cin >> H->a;
r->next = H;
r = H;
}
r->next = NULL;
//尾插法建立链表L2 元素个数为4 元素为递增输入
printf("请输入链表L2的4个元素:");
Node *Hb;
Hb = (Node*)malloc(sizeof(Node));
r = Hb;
for (int i = 0; i < 4; i++) {
Node *H;
H = (Node*)malloc(sizeof(Node));
cin >> H->a;
r->next = H;
r = H;
}
r->next = NULL;
//在带头结点的链表L1中删除出现在L2中的元素
deleteNode(*Ha, *Hb);
//输出Ha链表中的元素
show(*Ha, "L1");
}