王道第二章综合应用题2-8题 ---------7/20

//第二章第二题 
//第二章第二题 
#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 deletelist(DLinklist &L,int e)  //删除值为e的元素 
 {
 	DLinklist p=L->next,q=L;
 	while(p!=NULL)
 	{
 		if(p->data==e)
 		{
 			q->next=p->next;
 			free(p);
 			p=q->next; 
		 }
		 else
		 {
		 	p=p->next;
		 	q=q->next;
		 }
		 
	 }
 }
 void delete_range(DLinklist &L,int e,int g)  //删除值为e的元素 
 {
 	DLinklist p=L->next,q=L;
 	while(p!=NULL)
 	{
 		if(p->data>=e&&p->data<=g)
 		{
 			q->next=p->next;
 			free(p);
 			p=q->next; 
		 }
		 else
		 {
		 	p=p->next;
		 	q=q->next;
		 } 
	 }
 }
 void vers_print(DLinklist L)   //反向输出 
 {
 	/* 法一:空间复杂度为o(n) 
 	int data[100],i=0;
 	DLinklist p=L->next;
 	while(p!=NULL)
 	{
 		data[i]=p->data;
 		p=p->next;
 		i++;
	 }
	 for(i;i--;i>=0)
	 {
	 	printf("%d  ",data[i]);
	 }*/
	 //法二时间复杂度为o(n)
	  DLinklist L1=L->next,p=L1;
	  L->next=NULL;
	  while(L1!=NULL)
	  {
	  	L1=p->next;
	  	p->next=L->next;
	  	L->next=p;
	  	p=L1;
	  }
  } 
  void Sort(DLinklist &L)   // 排序
  {
  	DNode *p=L->next,*pre,*r=p->next;
	p->next=NULL;
	p=r;
	while(p!=NULL)
	{
	r=p->next;
	pre=L;
	while(pre->next!=NULL&&pre->next->data<p->data)
	{
		pre=pre->next;
	}
	p->next=pre->next;
	pre->next=p;
	p=r;
   } 
}
 void print(DLinklist L)  //遍历 
 {
 		DLinklist p=L->next;
 		while(p!=NULL)
 		{
 			printf("%d ",p->data);
 			p=p->next;
		 }
 }
 void detele_min(DLinklist &L)  //删除最小的 
 {
 	int min=L->next->data;
 	DLinklist p=L->next,q,q1,p1=L;
 	while(p!=NULL)
 	{
 		if(p->data<min)
 		{
 			min=p->data;
 			q=p;
 			q1=p1;
		 }
		 else
		 {
		 	p=p->next;
		 	p1=p1->next;
		 }
	 }
	 q1->next=q->next;
	 free(q);
	 printf("min:%d\n",min);
 }
 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 find_common(DLinklist L1,DLinklist L2)   //找到两个链表中相同的结点 
 {
 	
 	int data1[100],i=0,j=0;
 	DLinklist font[100],f;
 	DLinklist p1=L1->next,p2=L2->next;
 	while(p1!=NULL)
 	{
 		data1[i]=p1->data;
 		p1=p1->next;
 		i++;
	 }
	 
	 while(p2!=NULL)
 	{
 		int x=p2->data;
 		if(find(data1,x)!=-1)
 		{
 			font[j]=p2;
		 }
		 j++;
 		p2=p2->next;	
	 }
	// printf(" ok");
	 j=j-1;
	 //printf("j:%d\n",j);
	 for(j;j>=0;j--)
	 {
	 	f=font[j];
	 	printf("%d ",f->data);
	 }
	// printf("ok1");
 }
 int main()
 {
 	//	DLinklist L;
 	//	init(L);
 	//	print(L);
 	//	vers_print(L);
 	//	printf("------\n");
 	//	deletelist(L,1);
 	//	detele_min(L);
 	//	vers_print(L);
 	//	Sort(L);
 	//	delete_range(L,1,3);
 		DLinklist L1,L2;
 		init(L1);
 		init(L2);
 		printf("相同的节点:\n");
 		find_common(L1,L2);
 		printf("------\n");
 		return 0;
 }

注意4,6题(第一次未做出来)

指针数组与数组指针的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值