题目描述
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
1.本题中头文件引用及链表结点类型声明代码如下【此部分代码本题已经内置,无须提交】:
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} node;
2.本题中main函数已经写好,代码如下【此部分代码本题已经内置,无须提交】:
int main()
{
node *s1, *s2, *s3;
//创建第1个链表
s1 = create();
//创建第2个链表
s2 = create();
//生成交集构成的新链表
s3 = getIntersection(s1, s2);
//释放第1个链表空间
freeAll(s1);
//释放第2个链表空间
freeAll(s2);
//输出新链表
printLinkedTable(s3);
//释放新链表空间
freeAll(s3);
return 0;
}
请编写 create()、getIntersection(...)、freeAll、printLinkedTable(...)四个函数体代码并提交。
输入描述
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出描述
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
提示
1.在输出链表信息时,若链表为空,则输出:NULL
2.结构体空间需要使用malloc申请!
3.无用的空间需要使用free释放!
我的核心思路是排查s1和s2元素出现的次数,如
1 2 3 4分别对应a[0~3]=1;
1 2 1 4a[0]=2 a[1]=1 a[2]=1 a[3]=1
即从左至右排查当前元素(包括自己)在后面出现的次数
当然这只是没有好的算法来辅助的较为粗略的方法
node* create()
{
int n;
node* head = NULL, * pnew, * pend;
int i;
for (i = 1;; i++)
{
pnew = malloc(sizeof(node));
scanf("%d", &pnew->data);
if (pnew->data == -1)
break;
if (i == 1)
{
head = pnew; pend = pnew;
}
else
{
pend->next = pnew;
pend = pnew;
pnew->next = NULL;
}
}
return head;
}
node* getIntersection(node* head1, node* head2)
{
node* pnew = head1, * pnew1 = head2, * head3 = NULL, *p, *p1;
int i, j = 0, t = 1, a[10] = { 0 }, b[10] = { 0 };
node* k;
while (pnew != NULL)
{
k = pnew;
for (i = 0;; i++)
{
if (pnew->data == k->data)
b[j]++;
k = k->next;
if (k == NULL)
break;
}
pnew = pnew->next; j++;
}
j = 0;
while (pnew1 != NULL)
{
k = pnew1;
for (i = 0;; i++)
{
if (pnew1->data == k->data)
a[j]++;
k = k->next;
if (k == NULL)
break;
}
pnew1 = pnew1->next; j++;
}
pnew = head1;
j = 0;
while (pnew != NULL)
{
pnew1 = head2;
for (i = 0;; i++)
{
if (a[i] == 1 && b[j] == 1 && pnew->data == pnew1->data)
{
p = malloc(sizeof(node));
p->data = pnew->data;
if (t == 1)
{
head3 = p; p1 = p;
}
else
{
p1->next = p;
p1 = p;
p->next = NULL;
}
t++;
}
pnew1 = pnew1->next;
if (pnew1 == NULL)
break;
}j++;
pnew = pnew->next;
}
return head3;
}
void printLinkedTable(node* head)
{
node* p = head;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
if(head==NULL)
printf("NULL");
}
void freeAll(node* head)
{
node* p;
while (p = head)
{
head = p->next;
free(p);
}
}
仅供参考,本题没有参考任何人,只有自己的思考。所以会比一般写的更加冗杂。