[英]Sorting a linked list in an ascending way
我正在嘗試編寫一個將數字(來自用戶)插入節點(每個節點1個數字),然后以升序對它們進行排序的函數。 我寫了這個函數:
void insertnode(struct n_node *head)
{
struct n_node *temp = head;
int number;
printf("Please insert a number to the node\n");
scanf("%d", &number);
while (number != SENTRY)
{
while ((temp->next != NULL) && (temp->next->num < number))
{
temp = temp->next;
}
struct n_node *addNode = (struct n_node*)malloc(sizeof(struct n_node));
addNode->num = number;
if (temp->next == NULL && number < temp->num)
{
addNode->next = temp;
head = addNode;
}
else
{
addNode->next = temp->next;
temp->next = addNode;
}
temp = head;
scanf("%d", &number);
}
options();
}
它可以編譯,但是在我插入第一個數字后立即停止,給了我一個中斷消息並指出了這一行:
while ((temp->next != NULL) && (temp->next->num < number))
錯誤列表上沒有任何內容,感謝您的任何幫助,謝謝!
在您的算法中,您未按正確的順序測試特殊情況:
head
為NULL
,並且測試temp->next != NULL
調用未定義的行為。 您應該首先分配新節點,並通過一次測試檢查特殊情況:
struct n_node *addNode = malloc(sizeof(struct n_node));
addNode->num = number;
if (head == NULL || number < head->num) {
addNode->next = head;
head = addNode;
}
否則,您的迭代循環是正確的,並且當您達到錯誤條件時,將在temp
之后插入節點:
while (temp->next != NULL && temp->next->num < number) {
temp = temp->next;
}
addNode->next = temp->next;
temp->next = addNode;
循環變得更加簡單:
void insertnode(struct n_node **headp) {
struct n_node *head = *headp;
int number;
printf("Please insert a number to the node\n");
while (scanf("%d", &number) == 1 && number != SENTRY) {
struct n_node *addNode = malloc(sizeof(struct n_node));
if (addNode == NULL) {
printf("out of memory\n");
return;
}
addNode->num = number;
if (head == NULL || number < head->num) {
addNode->next = head;
*headp = head = addNode;
} else {
struct n_node *temp = head;
while (temp->next != NULL && temp->next->num < number) {
temp = temp->next;
}
addNode->next = temp->next;
temp->next = addNode;
}
}
options(); // head is not passed to the function?
}
還要注意API的更改,以允許函數更新調用方范圍內的列表頭,更改后的文件停止掃描文件末尾的數字或輸入除幻數外的非數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.