线性表的删除与合并(链表基础)
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
void CreateLink(LinkList *L,int cnt)
{
int i;
*L=(LinkList)malloc(sizeof(LNode));
LinkList p=*L;
p->next=NULL;
LinkList s;
for(i=0;i<cnt;i++)
{
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&(s->data));
p->next=s;
p=s;
}
p->next=NULL;
return ;
}
void del(LinkList *L1,LinkList *L2) //头指针方便了链表的操作 用头的next表示下一元素,而不是取当前的data
{
LinkList p=*L1; //而且头是不会变的,稳定的开头,不包含数据,只有地址。
LinkList q=*L2;
while(p->next&&q->next)
{
if(p->next->data<q->next->data)
p=p->next;
else if(p->next->data>q->next->data) //必须if else结构 ,三个if绝对错
q=q->next;
else
{
p->next=p->next->next;
q=q->next;
}
} //p到没到头都不必在尾接NULL;
LinkList head=*L1;
while(head->next)
{
if(head->next->next==NULL)
printf("%d\n",head->next->data);
else
printf("%d ",head->next->data); //链表最后不输空格的方法
head=head->next;
}
return ;
}
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
LinkList pa,pb,pc;//只是在函数 强调指针形式,定义的时候还是正常的
CreateLink(&pa,a);
CreateLink(&pb,b);
CreateLink(&pc,c);
LinkList mmm;
LinkList nnn;
mmm=(LinkList)malloc(sizeof(LNode));
nnn=mmm;
LinkList qb=pb,qc=pc;
while(qb->next&&qc->next) //为什么是 while(qb->next&&qc->next) 画个带头链表图就知道了
{
if(qb->next->data>qc->next->data)
qc=qc->next;
else if(qb->next->data<qc->next->data)
qb=qb->next;
else
{
nnn->next=qb->next;
nnn=qb->next;
qb=qb->next;
qc=qc->next;
}
}
nnn->next=NULL;
del(&pa,&mmm);
return 0;
}