鏈表操作總結

#include"stdio.h"
struct link{
	int data;
	struct link *next;
};
//創建鏈表
struct link *createLink(int *p,int num)
{
	struct link *head;
	struct link *newNode;
	struct link *pre;
	int i;
	head=(struct link *)malloc(sizeof(struct link));
	head->next =NULL;
	pre=head;
	for(i=0;i<num;i++)
	{
		newNode=(struct link *)malloc(sizeof(struct link));
		newNode->data =p[i];
		newNode->next =NULL;
		pre->next =newNode;
		pre=newNode;	
	}
	return head;
}
//輸出鏈表
void printLink(struct link *head)
{
	struct link *p;
	
	if(head->next  ==NULL)
		return ;
	p=head->next ;
	while(p)
	{
		printf("%d\n",p->data );
		p=p->next ;
	}
}

//鏈表的排序
struct link *sortLink(struct link *p)
{
	struct link *startNode,*endNode,*pra,*temp1,*temp2;
	int temp;
	startNode=p->next ;
	endNode=pra=startNode;

	if(startNode->next ==NULL)
		return p;
	//找到鏈表的表尾
	while(endNode->next )
	{
		pra=endNode;
		endNode=endNode->next ;	
	}
	while(pra!=startNode)
	{
		temp1=startNode;
		temp2=startNode->next ;
		while(1)
		{
			if(temp1->data>temp2->data )
			{
				temp=temp1->data ;
				temp1->data =temp2->data ;
				temp2->data =temp;
			}
			if(temp2==endNode)
				break;
			temp1=temp2;
			temp2=temp2->next ;
			
		}
		endNode=startNode;
		while(endNode->next!=pra )
			endNode=endNode->next ;	
		pra=endNode;
		endNode=endNode->next ;
	}
	return p;
}

//合併兩個鏈表
struct link *conLink(struct link *a,struct link *b)
{
	struct link *link1,*link2,*temp1,*temp2;
	link1=a->next ;
	link2=b->next ;
	temp2=link2->next ;
	while(link1->next !=NULL&&link2!=NULL)
	{
		temp1=link1->next ;
		if(temp1->data>link2->data )
		{
			link2->next=link1->next ;
			link1->next =link2;
			link2=temp2;
			temp2=temp2->next ;
			link1=link1->next ;
		}else
		{
			link1=temp1;
		}
	}
	if(link2!=NULL)
	{
	   while(link2)
	   {
		   link1->next =link2;
		   link1=link2;
		   link2=link2->next ;
	   }
	}
	return a;
	
}

struct link *comLink(struct link *a,struct link *b)
{
	struct link *link1,*link2;
	link1=a->next ;
	link2=b->next ;
	if(link1->data <link2->data )
		 return conLink(a,b);
	else
		return conLink(b,a);
}
//鏈表反轉
struct link *revLink(struct link *p)
{
	struct link *temp1,*temp2,*temp3;
	temp1=p->next ;
	if(temp1->next ==NULL)
		return p;
	temp2=temp1->next ;
	temp1->next =NULL;
	while(temp2->next !=NULL)
	{
		temp3=temp2->next ;
		temp2->next =temp1;
		temp1=temp2;
		temp2=temp3 ;	
	}
	temp3->next=temp1;
	p->next =temp3;
	return p;
}

void main()
{
	struct link *head;
	struct link *sortlink;
	struct link *A,*B;
	struct link *comlink;
	struct link *sortA,*sortB;
	struct link *revlink;
	int a[5]={2,55,4,66,7};
	int b[6]={3,44,55,6,7,77};
	printf("鏈表操作\n");
	
	 
	//創建一個鏈表
	head=createLink(a,5);
	printLink(head);
    

 
	//排序鏈表
	printf("鏈表排序\n");
	sortlink=sortLink(head);
	printLink(sortlink);
 
 
	//合併兩個鏈表
	A=createLink(a,5);
	B=createLink(b,6);
	sortA=sortLink(A);
	sortB=sortLink(B);
	printf("打印鏈表A\n");
	printLink(sortA);
	printf("打印鏈表B\n");
	printLink(sortB);
    comlink=comLink(sortA,sortB);
	printf("合併後的鏈表\n");
	printLink(comlink);
 
	A=createLink(a,5);
	printf("鏈表反轉前:\n");
	printLink(A);
	revlink=revLink(A);
    printf("鏈表反轉後:\n");
	printLink(revlink);
	

	getchar();
	
}

發佈了38 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章