链表中分别存储12345与54321,并将它们分别输出

对于这种问题,有两种实现方法:


1.分别建立两个链表,分别存12345和54321

#include
#include

typedef int  ElemType;  //数据元素的类型
typedef struct node
{
	ElemType data; //保存数据的, ”数据域“
		 
	struct node *next; //保存下一个元素的地址, ”指针域"
		 				//struct node *prev; //保存上一个元素的地址,
}Node;

Node *Insret1(Node *h,Node *p)
{
	if(h==NULL)
		return p;
	
	/*if(p==NULL)
		return h;*/
	
	Node *pk=h;
	Node *pr=NULL;

	while(pk)
	{
		if(pk->data < p->data)
		{
			if(pk==h)
			{
				p->next=pk;
				h=p;
				return h;
			}
			else
			{
				pr->next=p;
				p->next=pk;
			}
			break;
		}
		
		pr=pk;
		pk=pk->next;
		
	}
	
	if(pk==NULL)
		pr->next=p;	
	
	return h;
}


Node *Insret(Node *h,Node *p)
{
	if(h==NULL)
		return p;
	
	/*if(p==NULL)
		return h;*/
	
	if(p->data > h->data)
	{
		h->next=Insret(h->next,p);
	}
	else
	{
		p->next=h;
		h=p;
	}
	
	return h;
}

int main()
{
	int b,m;

	Node *first=NULL;
	Node *last=NULL;
	Node *p=NULL;
	Node *h=NULL;
	Node *q=NULL;
	
	while(1)
	{
		scanf("%d",&b);
		
		if(b==0)
			break;
		
		Node*p = malloc(sizeof(*p));
		p->data=b;
		p->next=NULL;

		Node*q = malloc(sizeof(*p));
		q->data=b;
		q->next=NULL;
		
		h=Insret(h,p);
		first=Insret1(first,q);
	}
	p=h;
	
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	
	printf("\n");
	
	while(first)
	{
		printf("%d ",first->data);
		first=first->next;
	}
	
	printf("\n");

	free(p);
	free(first);


	return 0;
}



这两个链表分别是q,p结点为连接的链表

下图为以p结点来建立的链表,它负责存储12345

Node*p = malloc(sizeof(*p));
p->data=b;
p->next=NULL;

h=Insret(h,p);

Node *Insret(Node *h,Node *p)
{
	if(h==NULL)
		return p;
	
	/*if(p==NULL)
		return h;*/
	
	if(p->data > h->data)
	{
		h->next=Insret(h->next,p);
	}
	else
	{
		p->next=h;
		h=p;
	}
	
	return h;
}

下图为以q结点来建链表的链表,它负责存储54321

Node*q = malloc(sizeof(*p));
q->data=b;
q->next=NULL;

first=Insret1(first,q);

Node *Insret1(Node *h,Node *p)
{
	if(h==NULL)
		return p;
	
	/*if(p==NULL)
		return h;*/
	
	Node *pk=h;
	Node *pr=NULL;

	while(pk)
	{
		if(pk->data < p->data)
		{
			if(pk==h)
			{
				p->next=pk;
				h=p;
				return h;
			}
			else
			{
				pr->next=p;
				p->next=pk;
			}
			break;
		}
		
		pr=pk;
		pk=pk->next;
		
	}
	
	if(pk==NULL)
		pr->next=p;	
	
	return h;
}

结果如下:

链表中分别存储12345与54321,并将它们分别输出_第1张图片

 

 

其中我是在代码里设置的是输入0时,停止给它输入数字。

2.先新建一个链表,将它输出后,再将它从头结点开始,一个一个给摘下来,并以相反的方向连接,从而达到效果。

代码如下:

#include
#include

typedef int  ElemType;  //数据元素的类型
typedef struct node
{
	ElemType data; //保存数据的, ”数据域“
		 
	struct node *next; //保存下一个元素的地址, ”指针域"
		 				//struct node *prev; //保存上一个元素的地址,
}Node;

Node *Insret(Node *h,Node *p)
{
	if(h==NULL)
		return p;
	
	/*if(p==NULL)
		return h;*/
	
	if(p->data > h->data)
	{
		h->next=Insret(h->next,p);
	}
	else
	{
		p->next=h;
		h=p;
	}
	
	return h;
}

int main()
{
	int b,i=0;
	int a[100];

	Node *pk=NULL;
	Node *pr=NULL;
	Node *p=NULL;
	Node *h=NULL;
	Node *q=NULL;
	
	while(1)
	{
		scanf("%d",&b);
		
		if(b==0)
			break;
		
		Node*p = malloc(sizeof(*p));
		p->data=b;
		p->next=NULL;

		h=Insret(h,p);
	}
	p=h,q=h;

	while(q)
	{
		printf("%d ",q->data);
		q=q->next;
	}
	printf("\n");
	
	while(p)
	{
		if(p==h)
		{
			pr=p;
			p=p->next;
			pr->next=NULL;
		}
		else
		{
			pk=p->next;
			p->next=pr;
			pr=p;
			p=pk;
		}
	}//此时已经改变了链表的存储

	while(pr)
	{
		printf("%d ",pr->data);
		pr=pr->next;
	}
	free(h);

	printf("\n");

	return 0;
}





改变它链表方向的代码:

while(p)
	{
		if(p==h)
		{
			pr=p;
			p=p->next;
			pr->next=NULL;
		}
		else
		{
			pk=p->next;
			p->next=pr;
			pr=p;
			p=pk;
		}
	}//此时已经改变了链表的存储

 效果如下:

 

 

但这种方法是已经在原链表的基础上改变了链表,链表的存储方式以从12345改成了54321.

我们将输出时的代码顺序改下:

p=h,q=h;

	
	while(p)
	{
		if(p==h)
		{
			pr=p;
			p=p->next;
			pr->next=NULL;
		}
		else
		{
			pk=p->next;
			p->next=pr;
			pr=p;
			p=pk;
		}
	}//此时已经改变了链表的存储
	
	while(q)
	{
		printf("%d ",q->data);
		q=q->next;
	}
	printf("\n");

	while(pr)
	{
		printf("%d ",pr->data);
		pr=pr->next;
	}
	free(h);

	printf("\n");

	return 0;
}

结果为:

 

 

所以该方法虽简便,但会改变原有链表的存储方向。

最后,如果有问题,还请见谅,新手上车,着实会出错。如有错误,望指出。

你可能感兴趣的:(地址,数据结构,c语言)