创建已排序的链接列表

时间:2013-04-16 17:49:24

标签: c linked-list

差不多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 = '\0';
if(head=='\0'){
    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 = '\0';
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!='\0'){
    printf("%d ",p->data);
    p = p->ptr;
}
}

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

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

1 个答案:

答案 0 :(得分:3)

您必须更改行

while(next->data<=num)

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

当您在第二次迭代中插入第二个元素next时将'\0',并尝试使用data获取字段next->data将导致分段错误。< / p>

next!='\0'为假(因为next=='\0')时,如果状态发生变化,则会中止while,因为&&的短路next->data未计算


修改

您的代码中存在更多问题。

如果您查看输入2 1 0,那么使用正确工作程序的输出应该是1 2,而是2 1。问题是,在insert函数中,您不会考虑插入当前最小元素的情况。

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

我将代码更改为正确行为:

#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上的代码以及正确的输出。