當前位置:首頁 » 編程語言 » c語言單鏈表的逆置

c語言單鏈表的逆置

發布時間: 2022-10-25 09:07:32

『壹』 c語言 單鏈表逆序問題

void
Reverse(List
&L)
//逆置鏈表子函數
{
List
q,p;
if(L&&L->Next)
//判斷是否兩個以上的元素
{
p=L->Next;
q=p->Next;
p->Next=NULL;//在第一和第二個節點間斷開,原來鏈表為兩個,分別由L和q指向
while(q)
{
p=q;
q=q->Next;//每次將p指向的第一個節點插入到L指向的節點後
p->Next=L->Next;
L->Next=p;
}
}
}

『貳』 試用C或類C語言編寫一個高效演算法,將一循環單鏈表就地逆置。

#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <process.h>

typedef struct lnode
{
int data;
struct lnode *next;
}lnode ,*linklist;
//建立一個空表,初始化,並對其進行輸入值

void creatlinklist(linklist &l,int n)
{
l=(linklist)malloc(sizeof(lnode));
if(!l)
exit(OVERFLOW);
l->next=l;//循環鏈表
linklist p,q;
int i;
q=l;
printf("please input %d data:\n",n);
for(i=0;i<=n-1;i++)
{
p=(linklist)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=p;
}
}

//逆置函數
void invert(linklist &l)
{
linklist p,q,r;
p=l->next;
q=p->next;
r=q->next;

while(p!=l)
{
q->next=p;
p=q;
q=r;
r=r->next;

}
q->next=l->next;
}

int main()
{
linklist l,p;
int length,i;
printf("please input the length of the list:\n");
scanf("%d",&length);
creatlinklist(l,length);
p=l->next;
while(p!=l)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
invert(l);
p=l->next;
do
{
printf("%d ",p->data);
p=p->next;
} while(p!=l->next);
printf("\n");
return 0;
}

『叄』 單鏈表的逆置是什麼意思

就是將鏈表反過來。

順序棧,可以解決這個問題,先依次進棧再出棧就可以完成以上逆置

『肆』 C語言鏈表逆置求解釋下語句謝謝

1、演算法的核心就是reverse函數,其它的都是輔助建立鏈表和輸出鏈表的。從數據結構的定義來看這是一個帶頭節點的鏈表。要弄的十分明白要耐心點畫圖看看。
2、思路:
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語言實現單鏈表的逆置

扣著的是頭節點(頭子)

車是首節點(首子)

馬是次節點(次子)

牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。

根據步驟寫程序的偽演算法(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語言編寫的對不帶頭結點的單鏈表進行就地逆置的演算法,求大神詳細解釋

voidreverse(linklist&L)
{
linklistp=NULL,q=L;
while(q!=NULL){
L=q->next;//保留下一個節點
q->next=p;
p=q;
q=L;//移動到下一個節點
}
L=p;//指向逆置後的頭節點
}

『柒』 實現單鏈表逆置

就是頭插法,圖片真心懶得畫……
每一步實現的是這樣的過程:
0(初始化)、q為每一步運算的主要節點位置,初始化為第一個;
1、r=q的後續,把q的後續記錄下來;
2、q-》next=p,把q的後續指向p(也就是開始),換句話說,把q放在了最開始;
3、p=q,把新的開始設置為新插入的q(下一次循環時,他就是p了);
4、q=r,把下一步要進行運算的主要節點設置為r,也就是當前運算節點的下個節點。

相當於,一隊小朋友雙手搭著前一個人的肩。從第二個開始,把他挪到第一個人前面去,然後對下一個人做同樣操作。
自己畫畫圖吧,指針就是這么個東西。

『捌』 如何用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:香頭跟著鐵頭

}

自己用道具操作幾遍,然後把流程背會,以後自己根據流程寫代碼即可。

『玖』 單鏈表的逆置演算法

幫你寫好了,你看下

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

typedef struct node
{
int data;
struct node *next;
}Node;

//創建鏈表
Node *CreatList(void)
{
int i;
Node *head, *p, *q;

head = NULL;
printf("請輸入您要輸入的數據:\n");
scanf("%d", &i);
while(i != 0)
{
p = (Node *)malloc(sizeof(Node));
p->data = i;
if(head == NULL)
q = head = p;
else
q->next = p;
q = p;
scanf("%d", &i);
}
p->next = NULL;
return head;
}

//鏈表的逆置
Node *ReverseList(Node *head)
{
Node *p, *q, *r;

p = head;
q=r=NULL;

while(p)
{
q = p->next;
p->next = r;
r = p;
p = q;
}
return r;
}

//輸出鏈表
void PrintList(Node *head)
{
Node *p;

p = head;
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
}

int main(void)
{
Node *head;

head = CreatList();
printf("鏈表逆置前的數據:\n");
PrintList(head);

head = ReverseList(head);
printf("鏈表逆置後的數據:\n");
PrintList(head);

return 0;
}

請輸入您要輸入的數據:
1 2 3 4 5 6 0
鏈表逆置前的數據:
1
2
3
4
5
6
鏈表逆置後的數據:
6
5
4
3
2
1

『拾』 高手看看我的C語言代碼單鏈表實現就地逆置

幫你改好了 你看看
#include <stdio.h>
#include <stdlib.h>
struct type{
int date; struct type * next;
}first;
int main()
{
struct type * opp(struct type * head);//定義演算法
struct type * head=&first;
struct type * p1=head;
struct type * p2=NULL;
first.date=0;
for(int i=1; i<13; i++)
{
p2=(struct type *)malloc(sizeof(struct type));
p2->date=i*2+1;
p1->next=p2;
p1=p1->next;
}
p2->next=NULL;
p1=NULL;//構造一個遞增的單鏈表做實驗
printf("單鏈表為\n");
p2=head;
for(; p2->next!=NULL; p2=p2->next)
{
printf("%d ",p2->date);
}
printf("\n");
head=opp(head);
p2=head;
for(; p2->next!=NULL; p2=p2->next)
{
printf("%d ",p2->date);
} printf("\n");
return 0;
}
struct type * opp(struct type * head)
{
struct type * pro=head;
struct type * flag=head->next;
struct type * next=flag->next;
pro->next=NULL;
while(next->next!=NULL)
{
flag->next=pro;
pro=flag;
flag=next;
next=next->next;
}
flag->next = pro;

next->next = flag;

return next;
}

熱點內容
字體android 發布:2025-07-12 21:30:38 瀏覽:621
資料庫中包含 發布:2025-07-12 21:25:08 瀏覽:621
艦娘緩存系統 發布:2025-07-12 21:21:21 瀏覽:100
cpu對存儲器的讀寫 發布:2025-07-12 21:21:14 瀏覽:772
如何建立一個網站需要伺服器 發布:2025-07-12 21:18:40 瀏覽:67
php登陸微信 發布:2025-07-12 21:17:55 瀏覽:14
公眾伺服器有什麼功能 發布:2025-07-12 21:11:22 瀏覽:715
健身的壓縮衣 發布:2025-07-12 21:11:12 瀏覽:754
磁碟伺服器如何管理磁碟 發布:2025-07-12 21:02:19 瀏覽:470
安卓返回鍵在哪裡取消 發布:2025-07-12 20:50:17 瀏覽:799