我想反轉鏈表以將頭指標引數提供給 reverse2 函式。
我希望 reverse2 函式反轉鏈表并將地址替換為頭指標
//linked list//
typedef struct node* lsnode;
typedef struct node
{
int data;
lsnode link;
}node;
//create the 3 nodes
lsnode create3()
{
lsnode first, second, last;
first = (lsnode)malloc(sizeof(node));
second = (lsnode)malloc(sizeof(node));
last = (lsnode)malloc(sizeof(node));
first->data = 30;
first->link = second;
second->data = 20;
second->link = last;
last->data = 10;
last->link = NULL;
return first;
}
//reverse the linkedlist
void reverse2(lsnode head)
{
lsnode q,p,r;
p = head;
q = NULL;
r = NULL;
while (p != NULL)
{
r = q;
q = p;
p = p->link;
q->link = r;
}
head = p;
}
int main(void)
{
lsnode head = create3();
reverse2(head);
while (head)
{
printf("%d\n", head->data);
head = head->link;
}
return 0;
}
該程式僅列印 30,但是我想列印 10 20 30 我的代碼有什么問題..
uj5u.com熱心網友回復:
根據評論中的一些建議,以下修改reverse2函式以傳遞被更改物件的地址,而不是物件本身,從而允許在呼叫函式回傳時參考修改后的物件。關于@Some程式員老兄關于可視化價值的建議,我發現這很有幫助。
此外,為了使代碼更易于理解,此代碼將單字母變數名稱擴展為任何閱讀代碼的人都更容易理解的符號。
typedef struct node* lsnode;
typedef struct node
{
int data;
lsnode next;//changed from link
}node;
//create the 3 nodes
lsnode create3()
{
lsnode first, second, last;
first = (lsnode)malloc(sizeof(node));
second = (lsnode)malloc(sizeof(node));
last = (lsnode)malloc(sizeof(node));
first->data = 30;
first->next = second;
second->data = 20;
second->next = last;
last->data = 10;
last->next = NULL;
return first;
}
//reverse the linkedlist
void reverse2(lsnode *head)//changed prototype,
{
//lsnode q,p,r;
lsnode prev,current,next;//note these changes throughout
current = *head;//note use of asterisk to reference
//object being changed
prev = NULL;
next = NULL;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}
int main(void)
{
lsnode head = create3();
reverse2(&head);//passes address of object to be modified
while (head)
{
printf("%d\n", head->data);
head = head->next;
}
return 0;
}
輸出:
10
20
30
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462799.html
