Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何对链表进行气泡排序?_C - Fatal编程技术网

C 如何对链表进行气泡排序?

C 如何对链表进行气泡排序?,c,C,我正在尝试创建一个链表并按冒泡排序。我成功地创建了链表,但当我尝试对其进行冒泡排序时,发生了一些意外,我不知道问题出在哪里。有什么问题 #include <stdio.h> #include <stdlib.h> //the struct of LinkedList typedef struct Node { int data; struct Node * pNext; }NODE,*PNODE; PNODE createList();//Creat

我正在尝试创建一个链表并按冒泡排序。我成功地创建了链表,但当我尝试对其进行冒泡排序时,发生了一些意外,我不知道问题出在哪里。有什么问题

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

//the struct of LinkedList
typedef struct Node
{
    int data;
    struct Node * pNext;
}NODE,*PNODE;

PNODE createList();//Creat one LinkedList
int lengthList(PNODE pHead);//get the length of LinkedList
void sortList(PNODE);//bubble sort

int main()
{
    int length;
    PNODE pHead=NULL;
    pHead=createList();
    sortList(pHead);
    return 0;
}
//Create LinkedList
PNODE createList()
{
    int i,n;
    int val;
    PNODE pHead=(PNODE)malloc(sizeof(NODE));
    if(pHead==NULL)
    {
        printf("failed to create!\n");
        exit(-1);
    }
    pHead->pNext=NULL;
    PNODE pTail=pHead;
    printf("please input the length of the LinkedList:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("number %d is:\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;
}
//get the length of LinkedList
int lengthList(PNODE pHead)
{
    int i=0;
    PNODE p=pHead->pNext;
    while(p!=NULL)
{
        i++;
        p=p->pNext;
    }
    return i;
}
//bubble sort
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;//here may be the error
        }
    }
    return;
}
#包括
#包括
//LinkedList的结构
定义表结点
{
int数据;
结构节点*pNext;
}节点,*PNODE;
PNODE createList()//创建一个LinkedList
国际长项选手(PNODE pHead)//获取LinkedList的长度
无效排序列表(PNODE)//气泡排序
int main()
{
整数长度;
PNODE pHead=NULL;
pHead=createList();
分类表(pHead);
返回0;
}
//创建链接列表
PNODE createList()
{
inti,n;
int-val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
如果(pHead==NULL)
{
printf(“创建失败!\n”);
出口(-1);
}
pHead->pNext=NULL;
PNODE pTail=pHead;
printf(“请输入链接列表的长度:”);
scanf(“%d”和“&n”);
对于(i=0;idata=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
返回pHead;
}
//获取LinkedList的长度
国际长度列表(PNODE pHead)
{
int i=0;
PNODE p=pHead->pNext;
while(p!=NULL)
{
i++;
p=p->pNext;
}
返回i;
}
//气泡排序
无效排序列表(PNODE pHead)
{
int i,j,t,len;
p节点,q;
len=长度列表(pHead);
p=pHead->pNext;
对于(i=0;idata>q->data)
{
t=p->数据;
p->data=q->data;
q->data=t;
}
p=q;//这里可能是错误
}
}
返回;
}

您在sortList中的列表即将结束

p=pHead->pNext;
for(i=0;i<len-1;i++)
{
    for(j=0;j<len-i;j++)
    {
        q=p->pNext;
        ....
        p=q;//here may be the error
    }
}
p=pHead->pNext;
对于(i=0;ipNext
的次数远远超过
len
的次数

错误2)pHead不需要是一个完整的节点-它只是一个PNODE指针。您从不使用它的数据字段。您应该让pHead指向列表中的第一个节点,然后在pHead而不是pHead->pNext开始迭代


错误3)您永远不会清理内存分配。

正如@Airsource指出的错误,请记住大多数错误都是由于程序设计选择不当造成的。试着像下面这样做&你会遇到更少的错误

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

typedef struct _Node{
    int data;
    struct _Node* next;
}Node;

typedef struct {
    Node* headPtr;
    Node* tailPtr;
    unsigned size;
}List;

static void create_node(List* list, int element) {
    if (list->headPtr == NULL) {
        // List is empty
        list->headPtr = (Node* )malloc(sizeof(Node));
        list->headPtr->data = element;
        list->headPtr->next = 0;
        list->tailPtr = list->headPtr;
        list->size++;
    }else{
        // List was already populated
        Node* temp = (Node* )malloc(sizeof(Node));
        temp->data = element;
        temp->next = 0;
        list->tailPtr->next = temp;
        list->tailPtr = temp;
        list->size++;
    }
}

void create_list(List* list, int length){
    int ele;
    int i;
    list->headPtr = list->tailPtr = 0;
    list->size = 0;

    for (i = 0; i < length; i++) {
        scanf("%d", &ele);
        create_node(list, ele);
    }
}

void print_list(List* list){
    Node* loop = list->headPtr;
    while(loop){
        printf("%d ", loop->data);
        loop = loop->next;
    }
    printf("\n");
}


 int main(){
    List* list;
    int n;
    printf("Enter the length of the list: ");
    scanf("%d", &n);
    create_list(list, n);
    print_list(list);
    bubble_sort(list);
    print_list(list);
    if (cleanup(list))
        printf("Memory rescued!!\n");
    else
        printf("OOPS!! Error\n");
 return 0;
}
为了清理,你要这样做

bool cleanup(List* list) {
    Node* curr = list->headPtr;
    Node* nxt = list->headPtr->next;
    while(nxt){
        free(curr);
        curr = nxt;
        nxt = curr->next;
    }
    list->headPtr = list->tailPtr = 0;
    list->size = 0;
    return !nxt ? true: false;
}

您的程序中有几个bug。我会逐一发言:

  • 第28行
    pnodephead=(PNODE)malloc(sizeof(NODE))
    在这里,您正在分配内存并在检查n是否大于0之前创建节点

  • 第36行
    printf(“请输入链接列表的长度:”)
    到目前为止,您已经创建了一个节点,
    head
    节点,其中没有任何值(因此包含垃圾)

  • 实际上,您的
    createList()
    创建了一个带有
    n+1
    节点的链表,而不是
    n
    ,并且
    头->值包含垃圾

    解决方案:

    printf("please input the length of the LinkedList:");
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
    
        if(pNew == NULL)
        {
            printf("failed to create!\n");
            exit(-1);
        }
    
        scanf("%d", &val);
        pNew->data = val;
        pNew->pNext = NULL;
    
        if (!i)
            pHead = pNew;
        else
            pTail->pNext = pNew;
        pTail = pNew;      
    }
    
    return pHead;
    
    for(i = 0; i < len - 1; i++)
    {
        p = pHead;
        for(j = 0; j < len - 1 - i; j++)
        {
            q = p -> pNext;
            if(p->data > q->data)
            {
                t = p -> data;
                p -> data = q -> data;
                q -> data = t;
            }
            p = q;
        }
    }
    
    一个问题:
    您如何检查元素是否已排序?
    printList()
    例程有助于发现上述错误


    “在处理输入之前,请始终通过显式打印来验证您是否正确存储了输入!”

    @rootkea:请不要建议您在将所有
    {
    移动到新行的地方进行编辑。如果OP更愿意将
    {
    在同一行,并且他们一直这样做,那么请保持代码不变。什么样的“事故”发生?请注意堆栈溢出不是调试服务。您必须提供更多关于您期望的和实际得到的详细信息。另外,请阅读:。@honk:Got!那么可能我应该将
    main
    函数的
    {
    移动到
    int main()的同一行
    为了保持一致性。谢谢,@rootkea,@honk。编译器说没有错误,但当我运行它时,程序意外地停止了。@rootkea:我只是为你做的。但是,请不要建议只移动几个括号的编辑。请关注需要整体编辑的帖子,并尽可能多地进行修复。这将有助于O大多数。如果你得到了>2k的代表,你也可以做一些小的编辑,因为这样你就不再需要限制审查者的时间了。谢谢你,@Airsource有限公司,太棒了!错误1)我已经解决了这个问题。错误2)pHead只是一个指针,没有实际的数据。Bug 3)我会清理我的内存分配。谢谢,@Airsource有限公司,这是我第一次尝试在这里提问,并得到好的答案,再次感谢你,我通常会在这里走动。Bug 2),是的,我明白了。但是pHead不需要是节点…我已经修改了我的答案。顺便说一句到目前为止,发现问题的最简单方法是在调试器中运行代码。谢谢,@Mayukh Sarkar,我会尝试!这样会更简洁!如果您觉得解决方案有趣,您应该向@Airsource和我投票。
    for(i = 0; i < len - 1; i++)
    {
        p = pHead;
        for(j = 0; j < len - 1 - i; j++)
        {
            q = p -> pNext;
            if(p->data > q->data)
            {
                t = p -> data;
                p -> data = q -> data;
                q -> data = t;
            }
            p = q;
        }
    }