单链表排序、逆序
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;
}
源代码:
#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;
}
相关文章推荐
- 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
- 将链表逆序排列的一个程序及思考的对链表依某一元素排序方法
- 括链表的创建,增加、删除节点,链表的逆序、排序和销毁
- 链表基础2(实现链表的逆序、将新结点插入到特定位置、边插结点边排序)
- iOS 算法面试题(冒泡排序、选择排序、链表逆序)~demo
- 链表的创建 查找 排序 插入 删除 逆序 长度 显示
- 链表:检测是否有环,是否相交,删除节点,插入节点,打印节点,建立节点,节点排序,节点逆序,
- 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
- 单链表(二):如何实现单链表的排序、逆置(逆序)
- 【每日算法】归并排序及其应用(逆序对&合并有序链表)
- 链表的逆序,排序等
- 单链表(二):如何实现单链表的排序、逆置(逆序)
- 链表的实现以及合并,排序,逆序,等
- 链表的排序和逆序
- 链表的创建、测长、排序、插入、逆序的实现(C语言)
- java链表排序
- 单链表插入排序
- 链表的删除,插入,查找,排序
- 剑指offer面试题25:合并两个排序的链表-java
- 单链表排序--冒泡法