鏈表的排序與逆置

鏈表所用的數據結構爲:

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

typedef Node* LinkList;

返回鏈表的長度:

int LinkLength(LinkList L)
{
	int length = 0;;
	while(L->next != NULL)
	{
		length++;
		L = L->next;
	}
	return length;
}

在鏈表的尾部插入數據:

void InsertList(LinkList* L,int e)
{
    LinkList p = *L;
    while(p->next != NULL)
        p = p->next;
    
    LinkList s = (LinkList)malloc(sizeof(Node));
        s->data = e;
        s->next = NULL;
        p->next = s;
}

鏈表的排序代碼如下:

LinkList Sort(LinkList *L)
{
	LinkList p = *L;
	int n = LinkLength(p);
	if(p == NULL || p->next == NULL)
		return p;
	for(int i = 1;i <= n;i++)
	{
		p = (*L)->next;                     //讓p始終指向第一個元素
		for(int j = 1;j <= n - i;j++)
		{
			if(p->data > p->next->data)    //和相鄰的元素比較
			{
				int temp = p->data;
				p->data = p->next->data;
				p->next->data = temp;
			}
			
			p = p->next;                   //讓p指向下一個結點 
		}
	}
}

鏈表逆置逆置的代碼如下:

void ReverseLink(LinkList L)
{
	LinkList p1,p2,p3;
	if(L->next == NULL || L->next->next == NULL)
	    return ;
	p1 = L;                     //p1指向頭結點
	p2 = L->next;               //p2指向第一個元素 
	while(p2)                   //如果p2不爲空的話,即p1不是最後一個結點
	{
		p3 = p2->next;          //先將p2指向的下一個結點保存起來
		p2->next = p1;          //將鏈表逆置,即讓下一個結點的next指向他前面的那個結點
		p1 = p2;                //將結點前移
		p2 = p3;
	}
	
	L->next->next = NULL;       //L是逆置之前的頭結點,
                                //L->next指向的是逆置之前的
                                //第一個結點逆置之後就變成了最後一個結點,
                                //所以讓最後一個結點的next指向NULL
	L->next = p1;               //循環結束後,p1變成了逆置前的最後一個結點,
                                //也就是逆置後的第一個結點,L始終是頭結點,
                                //所以讓頭結點指向第一個結點
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章