第二章王道数据结构练习题12-14题--7/21

#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;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值