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