當前位置:首頁 » 編程語言 » c語言鏈表反轉

c語言鏈表反轉

發布時間: 2022-05-29 03:15:38

Ⅰ 用c語言實現單鏈表的逆置,能將此程序詳細的解釋一下嗎

演算法的核心就是reverse函數,其它的都是輔助建立鏈表和輸出鏈表的。
從數據結構的定義來看這是一個帶頭節點的鏈表。要弄的十分明白你要耐心點畫圖看看。我簡單的說下思路:
【head是指向頭結點的】
p=head; //p最開始指向頭結點
s=p->next; //s最開始指向第一個節點
while(s->next!=NULL)//只要沒有到最後一個元素就繼續。最後一個元素的next肯定為NULL
{ //進入核心了樓主
t=s->next; //用t指向s後面的那個元素
s->next=p; //把s指向她前面那個,這個時候就實現了逆向了。而且是就地逆向。元素都沒有動的
p=s; //然後p向後移動s
s=t; //s向後移動到p
這樣到下一輪的時候又可以講下下個再指向剛才那個下一個。一次內推
}
s->next=p; //當最後一個的時候,還是要指向她的前一個。
head->next->next=NULL;//頭指針的下一個是指向原來的第一個。逆向後肯定是最後的那個了。所以最後的一個的next=NULL就明了了。
head->next=s;//s是逆序前的最後一個,逆序後是第一個,所以用頭指向他

畫個圖好好體會下,樓主!

Ⅱ C語言如何將單向鏈表的節點反向排列

遍歷 然後將節點地址全部存入數組 然後從鏈表尾部開始填入前一節的地址 頭部填入null 這樣就反轉鏈表了 當然別忘了把尾節點的指針填入鏈表指針

Ⅲ C語言: 鏈表反轉

是需要代碼嗎?輸出結果就是2,沒問題啊!

Ⅳ C語言反轉鏈表的遞歸演算法

可以用IF判斷語句
如果不符合你的要求就
停止調用。

Ⅳ 翻轉單向鏈表 c語言

#include <stdio.h>
#include <stdlib.h>

/*定義鏈表結構體*/
typedef struct _list {
int v;
struct _list* t;
}list;

/*輸出單鏈表*/
void show(list* h)
{
while(h) {
printf("%d ", h->v);
h = h->t;
}
putchar('\n');
}

/*逆序*/
void reverse(list** h)
{
list* t, *p;
p = *h; /*p保存上一個節點*/
t = p->t; /*t保存下一個節點*/
p->t = NULL; /*置尾節點為空*/
while(t) {
*h = t; /**h暫存當前節點*/
t = t->t; /*t遍歷指向下一個節點*/
(*h)->t = p; /*逆序,改變指向*/
p = (*h); /*更新p值為下個節點*/
}
}

int main()
{
int i;
list* h = NULL, *t;
for(i = 0; i < 10; ++i) {
t = (list*)malloc(sizeof(list));
t->v = i;
t->t = h;
h = t;
}
show(h);
reverse(&h);
show(h);
}

Ⅵ C語言原地逆轉單鏈表

List_ptrInvertList(List_ptrhead)//原地逆轉單鏈表head
{
List_ptrp=head,q=NULL,listend=head;
while(listend->next!=NULL)listend=listend->next;

while(p!=listend)
{
head=p->next;
listend->next=p;
if(q==NULL)p->next=NULL;
elsep->next=q;
q=p;
p=head;
}

returnhead;
}

Ⅶ C語言用鏈表實現逆序輸出

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

//定義鏈表節點
typedefstructLNode
{intdata;
structLNode*next;
}LNode,*Linklist;

//創建鏈表
Linklistcreate()
{inti,n;//i用於下面循環,n用來存放有效節點的字數
Linklistp,L;
printf("PleaseinputN=");
scanf("%d",&n);
L=(Linklist)malloc(sizeof(LNode));//分配一個不存放有效數據的頭結點
L->next=NULL;
for(i=0;i<n;i++)
{p=(Linklist)malloc(sizeof(LNode));//生成新節點
scanf("%d",&p->data);//輸入元素值
p->next=L->next;
L->next=p;
}
returnL;//返回頭節點;
}
//鏈表反轉輸出
LinklistReverseList(LinklistL,intst)//st為1時輸出結點數據
{if(L->next!=NULL)
ReverseList(L->next,1);
if(st)printf("%d",L->data);
returnL;
}

voidput(LinklistL)
{Linklistp;
p=L->next;
while(p!=NULL)
{printf("%d",p->data);
p=p->next;
}
printf(" ");
}

intmain()
{LinklistL;
L=create();
printf("A:");put(L);
printf("B:");
ReverseList(L,0);//附加結點未保存數據,故第二參數為0
return0;
}

Ⅷ C語言鏈表問題,初學者看不懂,求大神解釋下這個程序的每一步。

NODE * fun(NODE *h) //NODE是節點結構體定義,函數應該是返轉一個鏈表,也就是頭節點變成尾,尾變成頭
{ NODE *p, *q, *r;
p = h; //p指向傳進來的節點h,應該是頭節點
if (p == NULL) //假如傳進來的鏈表節點h為空,說明是空鏈表,沒法反轉,直接返回
return NULL;
q = p->next; //如果節點h不為空,q指向頭節點h的下一個節點
p->next = NULL; //使p的下一個節點為空,即不指向任何節點,成為尾節點。
while (q) // 如果q不空,一直執行下面的循環
{
r = q->next; //r 指向q的下一個節點,也就是讓r記住當前待處理的節點的下一個節點
q->next = p; //讓q的下一個節點指向p,也就是把q移到了原來頭節點的前面,成為新的頭節點
p = q;//這樣,q就相當於排到了p的前面,讓p指向新的頭節點
q = r ;//q指向下一下待處理節點
}//如果所有節點處理完,因為q始終是指向當前待處理節點的下一個節點,處理完後,下一個節點必然為空,while循環結束(while(q)相當於while(null))
return p;//返回新的頭節點

Ⅸ 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語言)

單鏈表反轉:
比如原鏈表為 head->1->2->3->NULL;
反轉後:head->3->2->1->NULL;


實現代碼:

#include<stdio.h>
#include<stdlib.h>
typedefstructNode
{
intdata;
structNode*next;
}*List;

#definenodestructNode

Listcreat(void);
Listre(Listhead,Listp,Listq);
voidOutlist(Listq);

intmain(intargv,char*argc[])
{
Listhead;
Listp;
Listq;
head=NULL;
head=creat();
p=head->next;
q=head;
re(head,p,q);
q=head->next;
Outlist(q);
system("pause");

return0;
}

Listcreat(void)
{
intdata;
Listhead;
Listp;
Listq;
intflag=1;
head=(List)malloc(sizeof(node));
q=head;
do
{
printf("請輸入正數(<MAX_INT輸入0表示輸入結束):");
scanf("%d",&data);
fflush(stdin);
if(0==data)
{
q->next=NULL;
flag=0;
}
else
{
p=(List)malloc(sizeof(node));
p->data=data;
q->next=p;
q=p;
}
}while(flag);
q=head->next;
Outlist(q);
returnhead;
}

voidOutlist(Listq)
{
while(NULL!=q)
{
printf("%d",q->data);
q=q->next;
}
printf(" ");
return;
}

Listre(Listhead,Listp,Listq)
{
if(NULL==p)
{
head->next=q;
}
else
{
p=re(head,p->next,q->next);
p->next=q;
if(head==q)
{
p->next=NULL;
}
}
returnq;
}
熱點內容
c語言等號 發布:2025-02-12 09:39:02 瀏覽:169
ug編程培訓要多少錢 發布:2025-02-12 09:38:27 瀏覽:620
小黃車的密碼怎麼打開 發布:2025-02-12 09:38:26 瀏覽:70
存儲時4k 發布:2025-02-12 09:33:31 瀏覽:87
stn資料庫 發布:2025-02-12 09:32:31 瀏覽:602
iossocket編程 發布:2025-02-12 09:32:20 瀏覽:899
sql語句相等 發布:2025-02-12 09:32:19 瀏覽:351
278源碼 發布:2025-02-12 09:22:40 瀏覽:248
13人牛牛源碼 發布:2025-02-12 09:22:40 瀏覽:155
win2008r2搭建iscsi伺服器 發布:2025-02-12 09:18:30 瀏覽:634