❶ c語言鏈表逆序怎麼理解
扣著的是頭節點(頭子)
車是首節點(首子)
馬是次節點(次子)
牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。
根據步驟寫程序的偽演算法(3步4循環,7張圖片搞定),如下:
第一個循環把馬弄到車前面,
第二個循環把相弄到馬前面
第三個循環把士弄到相前面
........
直到香指向為空後停止循環。
代碼如下:只需要一個首結點pHead,就能把鏈表找到,並倒置。具體代碼如下
p香=pHead->pNext;
p鐵=p香->pNext;
p香->pNext=NULL;
P香=p鐵
while(p香 !=NULL)
{
p鐵=p香->pNext;
p香->pNext=pHead->pNext;
pHead->pNext=p香;
p香=p鐵;
}
對照偽演算法(三步四循環),和上面的代碼是一一對應的:
第一步:香頭指向首子,鐵頭指向次子
第二步:刪掉首子指向次子(鐵頭所指向的那個子)的牙簽
第三步:香頭跟著鐵頭
以下循環條件:(條件:香頭指向不為空)
{
循環1:鐵頭移動到香頭的下一個指向
循環2:香頭的下一個指向首子
循環3:頭子的下一個跟著香頭
循環4:香頭跟著鐵頭
}
自己用道具操作幾遍,然後把流程背會,以後自己根據流程寫代碼即可。
❷ c語言鏈表逆置詳解
思路 ==》創建一個新的鏈表,然後順序遍歷原鏈表,將其每一項都前插到新鏈表中。這樣得到的新鏈表就是原鏈表的逆向鏈表例子看下面的#include <stdio.h>
//結構體,用整數作數據
typedef struct tNODE
{
int data;
struct tNODE *next;
}NODE;
//刪除鏈表,回收空間
void clear(NODE *head)
{
NODE *p;
while(head)
{
p=head->next;//保存下一個結點的地址
free(head);//刪除最先的一個結點
head=p;//指向下一個結點
}
}
//輸出整個鏈表中的數據
void write(NODE *head)
{
NODE *p;
p=head->next;//因為使用帶頭結點的鏈表,所以要跳過第一個結點
while(p)
{
printf("%d ", p->data);
p=p->next;//後移
}
printf("\n");
}
//鏈表逆序
void reverse(NODE *head)
{
NODE *p, *q, *r;
if(head->next)//至少有一個數據
{
p=head->next;//p指向第一個數據結點
q=p->next;//q指向第二個結點
p->next=NULL;//第一個結點逆序後當然就是最後一個
while(q)
{
r=q->next;//r指向第三個結點
q->next=p;//第二個結點的鏈指針指向第一個
p=q;//p指向第二個結點
q=r;//q指向第三個結點
}
head->next=p;//讓始終沒理的頭結點連到最後一個結點上
}
}
//生成鏈表,以-1表示結束
NODE *create()
{
NODE *h, *t;
int x;
h=malloc(sizeof(NODE));//建立頭結點
t=h;
scanf("%d", &x);
while(x!=-1)
{
t->next=malloc(sizeof(NODE));
t=t->next;
t->data=x;
scanf("%d", &x);
}
t->next=NULL;
return h;
}
int main()
{
NODE *head;
head=create();
write(head);
reverse(head);
write(head);
clear(head);
return 0;
}