實戰資料結構(8)_單連結串列的就地逆置

YunShell發表於2013-08-27
/************************************************************************/
/*@author lynnbest
問題3:單連結串列的就地逆置

                                                                     */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}listnode;

int length(listnode *head);
void InsertListNode(listnode *head,int pos,int data);
void printflist(listnode *head);
void InverseListNode(listnode *head); //單連結串列的就地逆置

void main()
{
	printf("   單連結串列的就地逆置	\n");
	printf("----by lynnbest ----\n\n");
	int a[]={1,2,3,4,5,6,7,8,9,10,11};
	int len=sizeof(a)/sizeof(a[0]);
	listnode *head=(listnode *)malloc(sizeof(listnode));//建立頭結點 
	if(NULL==head)
	{
		printf("head malloc建立失敗\n");
		exit(-1);
	}
	head->next=NULL;
	for(int i=0;i<len;i++)
		InsertListNode(head,i+1,a[i]);
	printf("就地逆置前為:\n");
	printflist(head);
	InverseListNode(head);
	printf("就地逆置後為:\n");
	printflist(head);
}


void InsertListNode(listnode *head,int pos,int data)
{	
	if(pos<1||pos>length(head)+1)
	{
		printf("插入位置錯誤\n");
		return;
	}
	listnode *pre=head,*q; //pre 先驅指標 q新開闢的節點
	if(NULL==(q=(listnode *)malloc(sizeof(listnode))))
	{
		printf("malloc分配失敗\n");
		exit(-1);
	}
	q->data=data;
	q->next=NULL;
	for(int i=1;i<pos;i++)
		pre=pre->next;
	q->next=pre->next;	//先更新新節點next
	pre->next=q;	//在更新pre next

}

int length(listnode *head)
{	
	listnode *p=head->next;
	int count=0;
	while(p!=NULL)
	{
		count++;
		p=p->next;
	}
	return count;
}
void printflist(listnode *head)
{	
	//printf("當前連結串列元素為:\n");
	listnode *p=head->next;
	while(p!=NULL)
	{
		printf("%3d",p->data);
		p=p->next;
	}
	printf("\n");
}

void InverseListNode(listnode *head)
{
/*	listnode *pre=NULL,*p=head->next,*s;//pre指向頭結點,p指向第一個元素
	while(p!=NULL)
	{
		s=p->next;		//s為待逆置節點
		head->next=p;	//p為當前要逆置的點
		p->next=pre;   //將當前指標 指向前一個節點
		pre=p;		//pre 更新
		p=s;		//p更新
	}
*/
	/************************************************************************/
	/*思路:
	1.先把頭結點next NULL
	2.然後儲存帶逆置點
	3.先將逆置的點的next域指向前一個 head->next
	4.在更新 head->next 
	5. 更新p=q;
																		*/
	/************************************************************************/
	listnode *p=head->next,*q;
	head->next=NULL;
	while(p)
	{
		q=p->next;
		p->next=head->next;
		head->next=p;
		p=q;
	}
}

相關文章