链表求助

Cyyuch115 2021-04-14 09:09:30
void paixu( Node* &L)
{
Node *temp;
int i;
int j;
Node * p;
Node * p1;
if (temp1 == 0)return;

for (i = 0; i < temp1-1 ; i++)
{

for (j = 0; j < temp1 - i-1; j++)
{
p = L;
p1 = L->next;
if (p->number > p1->number)
{
temp = p;
p = p1;
p1= temp;
temp=temp->next;
}
L=L->next;
}
}
}

当我这个链表只有两组数据的时候它是好排序的,为啥一多就排不了了啊?
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2021-04-17
  • 打赏
  • 举报
回复
void paixu( Node* &L)
{
Node *p, *q;

xxx tmp;
p = q = L;

for (p = L; p; p = p->next) {
for (q=L; q->next; q->next) {
if (q->number > q->next->data) {
tmp = q->number;
q->number = q->next->number;
q->next->number = tmp;
}
}
}

/*
Node *temp;
int i;
int j;
Node * p;
Node * p1;
if (temp1 == 0)return;

for (i = 0; i < temp1-1 ; i++)
{

for (j = 0; j < temp1 - i-1; j++)
{
p = L;
p1 = L->next;
if (p->number > p1->number)
{
temp = p;
p = p1;
p1= temp;
temp=temp->next;
}
L=L->next;
}
}
*/
}

供参考~

tmp变量类型不明确,定义为number的类型即可;

排序的方法是冒泡排序,算法是交换链表节点的数据部分,指针部分不变;
此外,链表排序用插入排序比较靠谱和好理解;
如下:

void paixu( Node* &L)
{
Node *p, *q;

#if 0 //bubble sort
xxx tmp;
p = q = L;

for (p = L; p; p = p->next) {
for (q=L; q->next; q->next) {
if (q->number > q->next->data) {
tmp = q->number;
q->number = q->next->number;
q->next->number = tmp;
}
}
}
#else //insert sort
Node *r, *pre;
p = L->next;
L->next = NULL;
while (p) {
q = p->next;

r = pre = L;
while (r) {
if (r->number > p->number) {
if (r == L) {
p->next = L;
L = p;
} else {
pre->next = p;
p->next = r;
}
break;
}
pre = r;
r = r->next;
}
if (r == NULL) {
p->next = NULL;
pre->next = p;
}
p = q;

}

#endif

/*
Node *temp;
int i;
int j;
Node * p;
Node * p1;
if (temp1 == 0)return;

for (i = 0; i < temp1-1 ; i++)
{

for (j = 0; j < temp1 - i-1; j++)
{
p = L;
p1 = L->next;
if (p->number > p1->number)
{
temp = p;
p = p1;
p1= temp;
temp=temp->next;
}
L=L->next;
}
}
*/
}

供参考~

没测试,楼主可以测试一下,有问题再提出来~
qzjhjxj 2021-04-16
  • 打赏
  • 举报
回复
引用 3 楼 自信男孩 的回复:
[quote=引用 2 楼 qzjhjxj 的回复:]供参考:
void paixu(Node **L,int ListLen)
{
                                       //Node *temp;
    int i, j;
    Node * p,*pre=NULL,* p1=NULL;

    if(ListLen == 0) return;           //if (temp1 == 0)return;

    for (i = 0; i < ListLen ; i++)     //for (i = 0; i < temp1-1 ; i++)
    {
        p=pre=*L;
        for (j = 0; j < ListLen-i-1; j++)//for (j = 0; j < temp1-i-1; j++)
        {
            p1 = p->next;
            if(p->data > p1->data)
            {
                 if(p == *L){
                    p->next = p1->next;
                    p1->next = p;
                    *L= pre = p1;
                 }else{
                    pre->next = p1;
                    p->next = p1->next;
                    p1->next =p;
                    pre = p1;
                 }
            }else{
                    pre = p;
                    p=p->next;
            }
        }
    }
}

//函数调用:
paixu(&L,10);
p1 = p->next;这句后面没对p1是否为NULL做判断,是存在隐患的~[/quote]不会有隐患,如果要再完善下,链表的长度不应从外部传入,修改如下:
void paixu(Node **L)//,int ListLen) //排序,从小到大
{
    int i,j,ListLen=0;
    Node * p=*L,*pre=NULL,* p1=NULL;

    while(p){ListLen++; p=p->next;}
    if(ListLen == 0) return;

    for (i = 0; i < ListLen ; i++)
    {
        p=pre=*L;
        for (j = 0; j < ListLen-i-1; j++)
        {
            p1 = p->next;
            if(p->data > p1->data)
            {
                if(p == *L){
                   p->next = p1->next;
                   p1->next = p;
                   *L= pre = p1;
                }else{
                   pre->next = p1;
                   p->next = p1->next;
                   p1->next =p;
                   pre = p1;
                }
            }else{
                pre = p;
                p=p->next;
            }
        }
    }
}
自信男孩 2021-04-16
  • 打赏
  • 举报
回复
引用 4 楼 qzjhjxj 的回复:
[quote=引用 3 楼 自信男孩 的回复:][quote=引用 2 楼 qzjhjxj 的回复:]供参考:
void paixu(Node **L,int ListLen)
{
//Node *temp;
int i, j;
Node * p,*pre=NULL,* p1=NULL;

if(ListLen == 0) return; //if (temp1 == 0)return;

for (i = 0; i < ListLen ; i++) //for (i = 0; i < temp1-1 ; i++)
{
p=pre=*L;
for (j = 0; j < ListLen-i-1; j++)//for (j = 0; j < temp1-i-1; j++)
{
p1 = p->next;
if(p->data > p1->data)
{
if(p == *L){
p->next = p1->next;
p1->next = p;
*L= pre = p1;
}else{
pre->next = p1;
p->next = p1->next;
p1->next =p;
pre = p1;
}
}else{
pre = p;
p=p->next;
}
}
}
}

//函数调用:
paixu(&L,10);


p1 = p->next;这句后面没对p1是否为NULL做判断,是存在隐患的~[/quote]不会有隐患,如果要再完善下,链表的长度不应从外部传入,修改如下:
void paixu(Node **L)//,int ListLen) //排序,从小到大
{
int i,j,ListLen=0;
Node * p=*L,*pre=NULL,* p1=NULL;

while(p){ListLen++; p=p->next;}
if(ListLen == 0) return;

for (i = 0; i < ListLen ; i++)
{
p=pre=*L;
for (j = 0; j < ListLen-i-1; j++)
{
p1 = p->next;
if(p->data > p1->data)
{
if(p == *L){
p->next = p1->next;
p1->next = p;
*L= pre = p1;
}else{
pre->next = p1;
p->next = p1->next;
p1->next =p;
pre = p1;
}
}else{
pre = p;
p=p->next;
}
}
}
}
[/quote]
不完善不就是有隐患吗?第二个参数随机输入肯定会有隐患的~
qzjhjxj 2021-04-15
  • 打赏
  • 举报
回复
供参考:
void paixu(Node **L,int ListLen)
{
                                       //Node *temp;
    int i, j;
    Node * p,*pre=NULL,* p1=NULL;

    if(ListLen == 0) return;           //if (temp1 == 0)return;

    for (i = 0; i < ListLen ; i++)     //for (i = 0; i < temp1-1 ; i++)
    {
        p=pre=*L;
        for (j = 0; j < ListLen-i-1; j++)//for (j = 0; j < temp1-i-1; j++)
        {
            p1 = p->next;
            if(p->data > p1->data)
            {
                 if(p == *L){
                    p->next = p1->next;
                    p1->next = p;
                    *L= pre = p1;
                 }else{
                    pre->next = p1;
                    p->next = p1->next;
                    p1->next =p;
                    pre = p1;
                 }
            }else{
                    pre = p;
                    p=p->next;
            }
        }
    }
}

//函数调用:
paixu(&L,10);
自信男孩 2021-04-15
  • 打赏
  • 举报
回复
引用 2 楼 qzjhjxj 的回复:
供参考:
void paixu(Node **L,int ListLen)
{
//Node *temp;
int i, j;
Node * p,*pre=NULL,* p1=NULL;

if(ListLen == 0) return; //if (temp1 == 0)return;

for (i = 0; i < ListLen ; i++) //for (i = 0; i < temp1-1 ; i++)
{
p=pre=*L;
for (j = 0; j < ListLen-i-1; j++)//for (j = 0; j < temp1-i-1; j++)
{
p1 = p->next;
if(p->data > p1->data)
{
if(p == *L){
p->next = p1->next;
p1->next = p;
*L= pre = p1;
}else{
pre->next = p1;
p->next = p1->next;
p1->next =p;
pre = p1;
}
}else{
pre = p;
p=p->next;
}
}
}
}

//函数调用:
paixu(&L,10);


p1 = p->next;这句后面没对p1是否为NULL做判断,是存在隐患的~
赵4老师 2021-04-14
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧