不同于市面上的用c++写的noj,此文章由c写,符合在校生需求,且附有注释,且看可可我慢慢更新。
代码由vs写,提交至noj时要把scanf_s改成scanf。
可可酱听说有的同学这周末要写到第六题呢,可可班级没有这个要求,但是可可会尽力的!
第一次写CREAT链表函数,用了指针传值,尽管编译通过了,但是运行会错误,可可百思不得其解,于是求助了最近的大牛——chatgpt,他告诉可可,要用指向指针的指针传值,不然链表的创建是失败的,大家要注意哦。(可可上课睡觉啦)
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}Lnode, * Listnode;
void CREAT(Listnode *head, int n)//后插法创建链表
{
Listnode rear, p;
*head = (Listnode)malloc(sizeof(Lnode));
(*head)->next = NULL;
rear = *head;
int i;
int num;
for (i = 0; i < n; i++)
{
scanf_s("%d", &num);//...
p = (Listnode)malloc(sizeof(Lnode));
p->data = num;
rear->next = p;
rear = p;
}
rear->next = NULL;
}
void DELETE(Listnode Lnode1, Listnode Lnode2, Listnode Lnode3)
{
int array[100];
int k = 0;
Listnode p1, p2, p3, r;
p1 = Lnode1->next;
p2 = Lnode2->next;
p3 = Lnode3;
while (p1 != NULL && p2 != NULL)
{
if (p1->data == p2->data)//注意是两个等号表示判断。
{
array[k++] = p1->data;
p1 = p1->next;
p2 = p2->next;
}
else if (p1->data > p2->data)//小的一组向后走。
{
p2 = p2->next;
}
else
{
p1 = p1->next;
}
}
int i = 0;
while (p3->next!= NULL)
{
if (p3->next->data == array[i])//删除
{
r = p3->next;
p3->next = r->next;
free(r);
}
else if (p3->next->data > array[i])//如果数组小,则加数组;其他反之。
{
i++;
}
else
{
p3 = p3->next;
}
}
}
int main()
{
Listnode head1, head2, head3;
head1 = (Listnode)malloc(sizeof(Lnode));
head2 = (Listnode)malloc(sizeof(Lnode));
head3 = (Listnode)malloc(sizeof(Lnode));
head1->next = NULL;
head2->next = NULL;
head3->next = NULL;
int num1, num2, num3;
scanf_s("%d %d %d", &num1, &num2, &num3);//...
CREAT(&head1, num1);//此处不输入数据类型
CREAT(&head2, num2);
CREAT(&head3, num3);
DELETE(head2, head3, head1);
Listnode s;
s = head1->next;
while (s!= NULL)
{
printf("%d ", s->data);//注意数字粘连。
s = s->next;
}
return 0;
}