所以我試圖用c撰寫一個程式,讓用戶輸入數字,直到輸入數字0。然后創建一個鏈表,將輸入的整數從小到大排序。這是我的代碼:
#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);
printf("%d->\n", num);
if(num) {
head = insert(head, num);
}
} while(num);
p = head;
printf("\nThe entered numbers are:\n");
while(p) {
printf("%d->", p->data);
p = p->ptr;
}
free_list(head);
printf("NULL");
return 0;
}
如您所見,輸出將如下所示:
Enter number: 6
6->NULL
Enter number: 3
3->NULL
Enter number: 9
9->NULL
Enter number: 0
0->
The entered numbers are :
3->6->9->NULL
但是,我想要的是在將這些數字輸入并插入串列時對其進行排序(我也需要不顯示 0)。所以輸出應該是這樣的:
Enter number: 6
6->NULL
Enter number: 3
3->6->NULL
Enter number: 9
3->6->9->NULL
Enter number: 0
The entered numbers are :
3->6->9->NULL
有人可以幫我解決這個問題嗎???
uj5u.com熱心網友回復:
您實際上是按排序順序將元素插入到串列中。您只是在讀入而不是整個串列后列印當前值。
所以將列印代碼放在一個函式中,然后在插入一個值并讀取所有值之后呼叫該函式。
uj5u.com熱心網友回復:
我修改了你的一些代碼,請檢查:
#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 ("\nEnter a number: ");
scanf ("%d", &num);
if (num != 0)
{
printf ("%d->\n", num);
}
if (num)
{
head = insert (head, num);
p = head;
printf ("\nThe entered numbers are:\n");
while (p)
{
printf ("%d->", p->data);
p = p->ptr;
}
}
}
while (num);
free_list (head);
return 0;
}
output->
Enter a number: 8
8->
The entered numbers are:
8->
Enter a number: 2
2->
The entered numbers are:
2->8->
Enter a number: 4
4->
The entered numbers are:
2->4->8->
Enter a number: 1
1->
The entered numbers are:
1->2->4->8->
Enter a number: 0
uj5u.com熱心網友回復:
我看不出你是如何得到這個輸出的
Enter number: 6
6->NULL
Enter number: 3
3->NULL
Enter number: 9
9->NULL
Enter number: 0
0->
在這個 do-while 回圈中
do {
printf("Enter a number: ");
scanf("%d",&num);
printf("%d->\n", num);
if(num) {
head = insert(head, num);
}
} while(num);
輸出某些東西的唯一陳述句是
printf("%d->\n", num);
但它不輸出字串->NULL。
在函式 insert 中沒有輸出陳述句。
要在 do while 陳述句中獲得所需的輸出,您需要撰寫
do {
printf("Enter a number: ");
scanf("%d",&num);
if(num) {
head = insert(head, num);
for ( p = head; p != NULL; p = p->ptr )
{
printf("%d->", p->data);
}
puts( "NULL " );
}
} while(num);
你的功能insert也太復雜了。if 陳述句和區域變數太多。函式可以寫得更簡單。例如
node * insert( node *head, int num )
{
node *temp = malloc( sizeof( node ) );
temp->data = num;
if ( head == NULL || head->data < num )
{
temp->ptr = head;
head = temp;
}
else
{
node *current = head;
while ( ( current->ptr != NULL ) &&
!( num < current->ptr->data ) )
{
current = current->ptr;
}
temp-ptr = current->ptr;
current->ptr = temp;
}
return head;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430956.html
