首页 > 对链表冒泡排序的错误

对链表冒泡排序的错误

构造了一个链表,在对链表进行排序的时候出错了。
程序可以编译通过,运行时“意外终止”,不知道哪里错了,恳请大神指导!
意外终止截图:

下面是代码:

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

//链表结构体
typedef struct Node{
    int data;
    struct Node * pNext;
}NODE,*PNODE;

PNODE createList();//创建链表
int lengthList(PNODE pHead);//获取链表长度
void sortList(PNODE);//冒泡排序

int main()
{
    int length;
    PNODE pHead=NULL;
    pHead=createList();
    sortList(pHead);
    return 0;
}
//创建链表
PNODE createList(){
    int i,n;
    int val;
    PNODE pHead=(PNODE)malloc(sizeof(NODE));
    if(pHead==NULL){
        printf("创建节点失败!\n");
        exit(-1);
    }
    pHead->pNext=NULL;
    PNODE pTail=pHead;
    printf("请输入要创建的链表长度:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("第 %d 个节点的值:\n",i+1);
        scanf("%d",&val);
        PNODE pNew=(PNODE)malloc(sizeof(NODE));
        if(pNew==NULL){
            printf("failed to create\n");
            exit(-1);
        }
        pNew->data=val;
        pTail->pNext=pNew;
        pNew->pNext=NULL;
        pTail=pNew;
    }
    return pHead;
}
//获取链表长度
int lengthList(PNODE pHead){
    int i=0;
    PNODE p=pHead->pNext;
    while(p!=NULL){
        i++;
        p=p->pNext;
    }
    return i;
}
//冒泡排序
void sortList(PNODE pHead){
    int i,j,t,len;
    PNODE p,q;
    len=lengthList(pHead);
    p=pHead->pNext;
    for(i=0;i<len-1;i++){
        for(j=0;j<len-i;j++){
            q=p->pNext;
            if( p->data > q->data){
                t=p->data;
                p->data=q->data;
                q->data=t;    
            }
            p=q;//可能是这里出错了
        }
    }
    return ;
}

找到错误了。

链表只有len个长度,但是我循环了len*len个长度,所以报错,现已经解决,谢谢!


  1. 循坏条件错了,len-1-i

  2. 比较条件错了,q->data > q->pNext->data

  3. 循环步进:q=q>q->pNext,p=p->pNext

  4. 你的内存没有释放。

  5. 希望你多自己调试程序,这样才能提高,而不是一错了就去问别人.
    正确代码如下:

``

include <stdio.h>

include <stdlib.h>

//链表结构体
typedef struct Node{

int data;
struct Node * pNext;

}NODE,*PNODE;

PNODE createList();//创建链表
int lengthList(PNODE pHead);//获取链表长度
void sortList(PNODE);//冒泡排序

void printList(PNODE pHead)
{

PNODE p = pHead->pNext;
while(p){
    printf("data:%d\n",p->data);
    p=p->pNext;
}

}

int main()
{

int length;
PNODE pHead=NULL;
pHead=createList();
printList(pHead);
sortList(pHead);
printList(pHead);
return 0;

}
//创建链表
PNODE createList(){

int i,n;
int val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL){
    printf("创建节点失败!\n");
    exit(-1);
}
pHead->pNext=NULL;
PNODE pTail=pHead;
printf("请输入要创建的链表长度:");
scanf("%d",&n);
for(i=0;i<n;i++){
    printf("第 %d 个节点的值:\n",i+1);
    scanf("%d",&val);
    PNODE pNew=(PNODE)malloc(sizeof(NODE));
    if(pNew==NULL){
        printf("failed to create\n");
        exit(-1);
    }
    pNew->data=val;
    pTail->pNext=pNew;
    pNew->pNext=NULL;
    pTail=pNew;
}
return pHead;

}
//获取链表长度
int lengthList(PNODE pHead){

int i=0;
PNODE p=pHead->pNext;
while(p!=NULL){
    i++;
    p=p->pNext;
}
return i;

}
//冒泡排序
void sortList(PNODE pHead){

int i,j,t,len;
PNODE p,q;
len=lengthList(pHead);
p=pHead->pNext;

for(i=0;i<len-1;i++){
    q=pHead->pNext;
    for(j=0;j<len-1-i;j++){
        
        if( q->data > q->pNext->data){
            t=q->data;
            q->data=q->pNext->data;
            q->pNext->data=t;    
        }
        q=q->pNext;
    }
    p=p->pNext;
}
return ;

}
``

【热门文章】
【热门文章】