您的位置:首页 > 其它

单链表排序、逆序

2006-01-24 23:07 162 查看
对单链表进行排序,我这里选择冒泡排序,选择对其关键字进行排序;而不选择交换结点。把链表逆序的话,基本思路就是使两结点之间的指向变反,也就是p1->p2变为p2->p1;把第一个结点的指针域设为NULL;最后使头结点指向尾结点。

源代码:

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

typedef struct node
{
int data;
struct node *next;
}linklist;
linklist *head=NULL; //head为头结点

linklist* CreateList() //尾插法建单链表
{
int _data;
linklist *pCurrent,*rear; //rear为尾指针,pCurrent为当前指针
head = (linklist*)malloc(sizeof(linklist));
rear = head;
scanf("%d",&_data);
while (_data != -1)
{
pCurrent = (linklist*)malloc(sizeof(linklist));
pCurrent->data = _data;
rear->next = pCurrent;
rear= pCurrent;
scanf("%d",&_data);
}
rear->next = NULL;
return head;
}

void ShowList(linklist *p)
{
while (p)
{
printf("%d,",p->data);
p = p->next;
}
printf("End/n");
}

void BubbleSortList(linklist *p) //链表冒泡排序
{
linklist *_temp = p->next;
linklist *_node = p->next;
int temp;
for (;_temp->next;_temp = _temp->next)
{
for (_node = p->next;_node->next;_node = _node ->next)
{
if (_node->data > _node->next->data)
{
temp = _node->data;
_node->data = _node->next->data;
_node->next->data = temp;
}
}
}
}

void ReverseList(linklist *p) //逆转链表
{
linklist *p1,*p2,*p3;
int _data;
p1 = p->next;
if (!p1->next)
return;
p2 = p1->next;
if (!p2->next)
{
_data = p1->data;
p1->data = p2->data;
p2->data = _data;
return;
}
p3 = p2->next ;
p1->next = NULL;
while (p3->next)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
p3->next = p2;
p->next = p3;
}

int main(void)
{
CreateList();
ShowList(head->next);

ReverseList(head);
ShowList(head->next);

BubbleSortList(head);
ShowList(head->next);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: