链表的排序与逆置

链表所用的数据结构为:

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始终是头结点,
                                //所以让头结点指向第一个结点
}

猜你喜欢

转载自blog.csdn.net/yue_jijun/article/details/81323559
今日推荐