我試圖弄清楚如何操作鏈表。我想洗掉給定鏈表的結束節點并將其添加到另一個給定鏈表的末尾。
出于某種原因,我不能正確地指出我的指標,好吧——至少我認為問題出在哪里。
(此方法位于一個 while 回圈中,因此一個串列不斷變小,而另一個串列不斷增長。)
void movenode(struct Node **cards,struct Node **column)
{
struct Node *head = NULL;
struct Node *tmp,*head1 = *cards;
struct Node *tmp2,*head2 = *column;
if (*cards == NULL || (*cards)->next == NULL){
return;
}
while (tmp->next != NULL) {
head->next = tmp;
tmp = tmp->next;
}
while (tmp2->next != NULL) {
tmp2 = tmp2->next;
}
head->next = NULL;
tmp2->data = tmp;
tmp2->next = NULL;
*cards = head1;
*column = head2;
}
希望有人能夠幫助我更好地理解這一點。
uj5u.com熱心網友回復:
出于某種原因,我無法正確指出我的指標,嗯.. 至少這是我認為問題所在。
你是對的,但它不止于此。例如,在struct Node *head = NULL;
沒有修改 中的值之后head
,因此每次您都head->next
在“NULL 小偏移量”處訪問記憶體(并且可能會崩潰)。
要從單鏈表中洗掉最后一個條目,您必須找到最后一個條目之前的條目(以便您可以修改它next
);并且要將條目添加到鏈接串列中,您必須找到最后一個條目(以便您可以修改它next
)。考慮到這一點,我們可以將其分為 5 個部分:
進行完整性檢查
*cards
查找串列中最后一個條目之前的條目洗掉串列中的最后一個
*cards
條目查找串列中的最后一個
*column
條目將(洗掉的)條目添加到
*columns
串列的末尾
您可以一次實作這 5 個部分中的每一個(并對其進行測驗)。這是編程的一個重要部分——將更復雜的東西分解成更簡單的東西。
生成的代碼可能類似于(未經測驗):
void movenode(struct Node **cards,struct Node **column) {
struct Node *temp = *cards;
struct Node *removed;
// Do sanity checks
if (temp == NULL) {
return;
}
// Find the entry before the last entry in the `*cards` list
if(temp->next != NULL) {
while(temp->next->next != NULL) {
temp = temp->next;
}
}
// Remove the last entry in the `*cards` list
if(temp == NULL) {
// The last entry was the first entry
removed = temp;
*cards = NULL;
} else {
removed = temp->next;
temp->next = NULL;
}
// Find the last entry in the `*column` list
temp = *column;
if(temp != NULL) {
while(temp->next != NULL) {
temp = temp->next;
}
}
// Add the (removed) entry to the end of the `*columns` list
if(temp == NULL) {
// There was no last entry (list was empty)
*column = removed;
} else {
temp->next = removed;
}
}
uj5u.com熱心網友回復:
我不完全確定您的解決方案的機制,因此我將提供單獨的實作和解決方案。
typedef struct Node {
void *data;
struct Node *next;
}
void poppush(Node *popHead, Node *pushHead) {
Node *pushLastNode = pushHead;
while (pushLastNode->next != NULL) {
pushLastNode = pushLastNode->next;
}
Node *popLastNode = popHead;
while (popLastNode->next != NULL) {
popLastNode = popLastNode->next;
}
Node *popSecondLastNode = popHead;
while (popSecondLastNode->next != popLastNode) {
popSecondLastNode = popSecondLastNode->next;
}
popSecondLastNode->next = NULL;
pushLastNode->next = popLastNode;
}
但是,對于此類操作,我建議使用雙向鏈表和/或創建一些專用于管理串列的函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/469330.html
下一篇:帶有函式指標的結構體