很多站长朋友们都不太清楚单链表排序php,今天小编就来给大家整理单链表排序php,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 一单链表中元素无序,编写算法将之排成有序序列 2、 单链表上难以实现的排序方法 3、 单链表冒泡排序 4、 单链表排序问题:int *PrintfElement3(LinkList *pointer, DataType MAX)提示类型冲突,实在是没找到. 5、 单链表实现简单选择排序 一单链表中元素无序,编写算法将之排成有序序列由冒泡排序得到启示,每趟均从头节点开始扫描,比较相邻两节点的数据,
满足特定要求时进行节点交换。
需要注意的是,必须有一个指针保存当前节点的前一个位置,这样在交换
节点后链表不会断开;并且要指定一个哨兵节点作为每趟比较的终结点,该哨
兵节点实际上就是有序区的首节点。
struct Node {
int data;
Node *next;
};
/* 因为排序后头结点指针可能发生改变,所以参数是二级指针 */
void listSort(Node **head)
{
if(head == NULL || *head == NULL)
return;
Node *cur, *post, *pre, *sentinel = NULL; // sentinel 标记有序区的首个节点
bool sorted;
do {
pre = NULL;
cur = *head;
sorted = true;
/* 反复用当前节点 cur 与下一个节点 post 进行比较 */
while((post = cur->next) != sentinel) {
if(cur->data > post->data) {
sorted = false; // 发生交换,则仍未有序
cur->next = post->next;
post->next = cur;
if(pre != NULL)
pre->next = post;
pre = post;
if(cur == *head)
*head = post; // 保证头指针指向最小的节点
} else {
pre = cur;
cur = post;
}
}
sentinel = cur; // cur 为该趟排好序的节点
} while(!sorted); // 若未发生交换,则已经有序
}
单链表上难以实现的排序方法单链表上难以实现的排序方法是快速排序。根据查询相关公开信息显示,单链表上难以实现的排序方法是快速排序法,包括堆排序和希尔排序,使用数组制作的静态树,使用单链表进行该算法。
单链表冒泡排序我估计楼主是写链表排序被各种指针操作绕迷糊了。提供一个清晰的思路:反向冒泡,步骤如下:1。从链表头开始操作,将第一个元素和后面的比较,将大者换到后面去。反复操作直至链表尾。2。链表尾提前一位(因为最后一个元素已经是最大值,无需再处理了)3。重复1,2步 ,直至链表尾等于链表头,既表明处理结束struct Node
{
int value;
Node* next;
};void Sort(Node* head)
{
Node* tail = NULL; while(tail != head->next)
{
Node* pre = head;
Node* cur = pre->next;
while(cur != tail cur->next != tail)
{
if( cur->value > cur->next->value )
{
//交换当前节点和后一个节点
pre->next = cur->next;
cur->next = cur->next->next;
pre->next->next = cur;
}
pre = pre->next;
cur = pre->next;
} tail = cur;
}
}void main()
{
Node* head = new Node();
Node* cur = head; //使用带表头的链表
int n = 10;
//初始化链表数据
for( int i = n; i >0; i-- )
{
Node* node = new Node();
node->value = i;
cur->next = node;
cur = node;
} //排序 Sort(head);
}
单链表排序问题:int *PrintfElement3(LinkList *pointer, DataType MAX)提示类型冲突,实在是没找到.你的SequenceLinkList函数里调用了PrintfElement3函数,但是函数SequenceLinkList却在PrintfElement3函数前声明,所以编译器发出错误的警告;
而且你在PrintfElement3函数里又调用了swap函数;但函数swap又在函数PrintfElement3之后声明,犯了同样的错误;
解决办法:
颠倒他们的声明顺序;
在代码开头声明他们的函数原型;
/*给你改好了,你也可以自己改,强化记忆*/
#include<stdio.h>
#include<stdlib.h>
#define DataType int
typedef struct Node
{
DataType data;
struct Node *next;
}LinkList;
LinkList *CreateHeadList(void) //创建头节点
{
LinkList *pointer;
pointer=(LinkList *)malloc(sizeof(LinkList));
if(!pointer)
{
perror("Error1");
exit(0);
}
pointer->data=-255;
pointer->next=NULL;
return pointer;
}
LinkList *CreateLinkList(LinkList *pointer,int num) //创建链表
{
LinkList *p;
int i;
p=pointer;
for(i=0;i<num;i++)
{
p->next=(LinkList *)malloc(sizeof(LinkList));
p=p->next;
p->data=i+10;
}
p->next=NULL;
return pointer;
}
void PrintfEveryElement(LinkList *pointer) //遍历整个链表
{
LinkList *p=pointer->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
}
LinkList *DeleteOne_Element(LinkList *pointer,int NO_num) //在NO_num删除一个元素
{
LinkList *p,*p1;
int i=1;
p=pointer;
if(p->next==NULL)
{
perror("Error2");
exit(0);
}
while(p->next!=NULL i<NO_num)
{
p=p->next;
i++;
}
if(p->next==NULL)
{
perror("Error3");
exit(0);
}
p1=p->next;
p->next=p1->next;
free(p1);
return pointer;
}
LinkList *InsertOne_Element(LinkList *pointer,int NO_num1) //在某一位置插入元素
{
LinkList *p,*p1;
int i=1;
p=pointer;
if(p->next==NULL)
{
perror("Error4");
exit(0);
}
while(p!=NULL i<NO_num1)
{
p=p->next;
i++;
}
if(p->next==NULL)
{
p1=(LinkList *)malloc(sizeof(LinkList));
p1->data=999;
p->next=NULL;
}
else
{
p1=(LinkList *)malloc(sizeof(LinkList));
p1->data=999;
p1->next=p->next;
p->next=p1;
}
return pointer;
}
void swap(int *p,int *p1)
{
*p^=*p1;
*p1^=*p;
*p^=*p1;
}
int *PrintfElement3(LinkList *pointer, DataType MAX)
{
LinkList *p=pointer->next;
static DataType array[20];
int i=0,j=0,flag,*p1;
while(p!=NULL i<MAX)
{
array[i]=p->data;
i++;
p=p->next;
}
for(i=0;i<MAX;i++)
{
flag=0;
for(j=0;j<MAX-i-1;j++)
{
if(array[j]<array[j+1])
{
swap((array[j]),(array[j+1]));
flag=1;
}
}
if(flag==1)
break;
}
p1=array;
return p1;
}
LinkList *SequenceLinkList(LinkList *pointer,int MAX)
{
int max=MAX;
DataType *H;
H=PrintfElement3(pointer,max);
}
int main(void)
{
LinkList *pointer;
int num,NO_num,NO_num1;
printf("请输入所需元素数量:");
scanf("%d",num);
pointer=CreateHeadList();
pointer=CreateLinkList(pointer,num);
PrintfEveryElement(pointer);
printf("\n");
printf("请输入删除元素的位置:");
scanf("%d",NO_num);
pointer=DeleteOne_Element(pointer,NO_num);
PrintfEveryElement(pointer);
printf("\n");
printf("请输入插入元素的位置:");
scanf("%d",NO_num1);
pointer=InsertOne_Element(pointer,NO_num1);
PrintfEveryElement(pointer);
printf("\n");
printf("排序输出:\n");
pointer=SequenceLinkList(pointer,num);
PrintfEveryElement(pointer);
return 0;
}
单链表实现简单选择排序单向链表的相关操作
实现功能:
1. 创建一个新链表。
2. 插入节点。
3. 删除节点。
4. 插入法排序链表(从小到大)。
5. 选择法排序链表(从小到大)。
6. 显示当前链表。
0. 退出程序。
代码见参考资料
关于单链表排序php的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于单链表排序php 单链表排序的时间复杂度的详细内容...