#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
int data;
struct DNode *next;
} DNode,*DLinklist;
void init(DLinklist &L) //初始化链表 利用前插法
{
int x=0;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
printf("请输入:\n");
scanf("%d",&x);
DNode *s;
while(x!=999)
{
s=(DLinklist)malloc(sizeof(DNode));
s->data=x;
s->next=L->next;
L->next=s;
printf("请输入:\n");
scanf("%d",&x);
}
}
void list_endinsert(DLinklist &L) //尾插法建立单链表
{
DNode *s;
int x;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
printf("请输入:\n");
scanf("%d",&x);
DNode *p=L;
while(x!=999)
{
s=(DNode *)malloc(sizeof(DNode));
s->data=x;
s->next=p->next;
p->next=s;
p=s;
printf("请输入:\n");
scanf("%d",&x);
}
}
void print(DLinklist L) //遍历
{
DLinklist p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int find(int data[],int x) //判断x是否在数组data中
{
for(int i=0;data[i]!='\0';i++)
{
if (data[i]==x)
return 1;
}
return -1;
}
void deletesame(DLinklist L) //令链表中的元素不会相互重复
{
int data1[100],i=0,j=0;
DLinklist p=L->next,q=p,end=L;
L->next=NULL;
while(q!=NULL)
{
if(find(data1,q->data)!=1)
{
data1[i]=q->data;
i++;
end->next=q;
p=q->next;
q->next=NULL;
end=q;
q=p;
}
else
{
q=q->next;
}
}
}
void diverse(DLinklist &L1) //将L1倒置
{
DLinklist p=L1->next,r=p,m1=r;
L1->next=NULL;
while(r!=NULL)
{
r=r->next;
p->next=L1->next;
L1->next=p;
p=r;
}
}
void guibing(DLinklist L1,DLinklist L2) //将两个递增单链表归并为一个递减的链表
{
DLinklist p1=L1->next,pre1=L1,p2=L2->next,pre2=L2;
while(p2!=NULL)
{
pre1=L1;
p1=L1->next;
while(p1!=NULL)
{
if(p1->data<p2->data)
{
if(p1->next==NULL)
{
p1->next=p2;
pre2->next=p2->next;
p2->next=NULL;
break;
}
else
{
p1=p1->next;
pre1=pre1->next;
}
}
else
{
pre1->next=p2;
pre2->next=p2->next;
p2->next=p1;
break;
}
}
p2=pre2->next;
}
diverse(L1);
}
void produce(DLinklist L1,DLinklist L2) //从链表A,B的公共元素中生成单链表C
{
int data1[100],i=0,j=0;
DLinklist Lc,s,f;
Lc=(DLinklist)malloc(sizeof(DNode));
Lc->next=NULL;
DLinklist p1=L1->next,p2=L2->next;
while(p1!=NULL)
{
data1[i]=p1->data;
p1=p1->next;
i++;
}
f=Lc;
while(p2!=NULL)
{
int x=p2->data;
if(find(data1,x)!=-1)
{
s=(DNode *)malloc(sizeof(DNode));
s->data=x;
s->next=NULL;
f->next=s;
f=s;
}
j++;
p2=p2->next;
}
print(Lc);
}
void destory(DLinklist L) //销毁链表
{
DLinklist p=L->next,r=p;
while(p!=NULL)
{
p=p->next;
free(r);
r=p;
}
free(L);
}
int main()
{
DLinklist L1,L2;
list_endinsert(L1);
list_endinsert(L2);
// deletesame(L);
// guibing(L1,L2);
// print(L1);
// print(L2);
produce(L1,L2);
destory(L1);
destory(L2);
return 0;
}
第二章王道数据结构练习题12-14题--7/21
最新推荐文章于 2024-07-17 22:15:09 发布