C语言 创建一个排序链表



近3年后,我开始重新学习C

我已经创建了一个Linked list,并希望将其扩展到创建一个排序链表。下面是我的代码:

typedef struct node{
int data;
struct node *ptr;
}node;
node* insert(node* head, int num){
node *temp,*prev,*next;
temp = (node*)malloc(sizeof(node));
temp->data = num;
temp->ptr = '';
if(head==''){
    head=temp;
}else{
    next = head;
    prev = next;
    while(next->data<=num){
        prev = next;
        next = next->ptr;
    }
    if(next==NULL){
        prev->ptr = temp;
    }else{
        temp->ptr = prev->ptr;
        prev-> ptr = temp;
    }
}
return head;
}
void main(){
int num;
node *head, *p;
head = '';
do{
    printf("Enter a number");
    scanf("%d",&num);
    if(num!=0)
        head = insert(head,num);
}while(num!=0);
p = head;
printf("nThe numbers are:n");
while(p!=''){
    printf("%d ",p->data);
    p = p->ptr;
}
}

这是我的想法。我遍历列表,直到我找到一个数字>=的输入。我将前一个节点存储在prev中,next节点包含当前值。如果next为null,则列表结束,并且该数字在列表中最高,因此它将被插入到最后一个位置,如果该数字在中间的某个位置,则prev节点的地址部分存储在临时节点的地址部分中,现在临时节点指针保存下一个节点的地址。

编辑:我的代码的问题是,如果我输入1,2,我得到错误消息作为a.exe has stopped working。我使用MinGW进行编译。当用户输入0时,我打破了循环。

你必须改变行

while(next->data<=num)

while(next!='' && next->data<=num)

当您插入第二个元素时,next将在第二次迭代时成为'',并且试图用next->data获得data字段将导致分割错误。

在while语句中改变了条件,如果next!=''为假(即next==''), while语句终止,并且由于&&的短路,next->data不被计算。


编辑

你的代码中有更多的问题。

如果您查看输入2 1 0,那么具有正确工作程序的输出应该是1 2,但它是2 1。问题是,在insert函数中,您没有考虑插入当前最小元素作为新头部的情况。

另一个问题是,您没有在最后释放malloc ed内存,这会导致内存泄漏。

我修改了你的代码,使其正常运行:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int data;
    struct node *ptr;
} node;
node* insert(node* head, int num) {
    node *temp, *prev, *next;
    temp = (node*)malloc(sizeof(node));
    temp->data = num;
    temp->ptr = NULL;
    if(!head){
        head=temp;
    } else{
        prev = NULL;
        next = head;
        while(next && next->data<=num){
            prev = next;
            next = next->ptr;
        }
        if(!next){
            prev->ptr = temp;
        } else{
            if(prev) {
                temp->ptr = prev->ptr;
                prev-> ptr = temp;
            } else {
                temp->ptr = head;
                head = temp;
            }            
        }   
    }
    return head;
}
void free_list(node *head) {
    node *prev = head;
    node *cur = head;
    while(cur) {
        prev = cur;
        cur = prev->ptr;
        free(prev);
    }       
}
int main(){
    int num;
    node *head, *p;
    head = NULL;
    do {
        printf("Enter a number");
        scanf("%d",&num);
        if(num) {
            head = insert(head, num);
        }
    } while(num);
    p = head;
    printf("nThe numbers are:n");
    while(p) {
        printf("%d ", p->data);
        p = p->ptr;
    }
    free_list(head);
    return 0;
}

请参阅https://ideone.com/wT5iQ8查看我的testinput代码以及正确的输出。

相关内容

  • 没有找到相关文章

最新更新