c語言單鏈表反轉
① 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>
#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語言 單鏈表的倒序
struct student *reverse(struct student *head)
{
struct student *p1,*p2,*p3;
p2=head;p3=head->next;
do
{ p1=p2;p2=p3;p3=p2->next;p2->next=p1;
}
while(p3!=NULL);
//這個循環就是使得p2取到頭指針head所指向的鏈表的尾部
//同時,在這個過程中,始終保持p2->p3->p1這樣的順序
//因此,循環結束後,必然得到原來鏈表的逆序鏈表
//(好吧,描述起來有些別扭,但是情況就是這樣的)
head->next=NULL;
return(p2);
}
struct student *p0,*p1,*p2;
p0=head;
p1=p0->next;
p2=p0;
if(p0->next!=NULL)
{
while(p1->next!=NULL)
p1=p1->next;
p1->next=p0;//這句,明顯錯啦!你讓所有的head所指向的鏈表的節點都變成p0啦!
head=p1;//這個語句執行的最終結果就是:head=last
}
while(p0->next!=NULL)//好好理解下人間正確的代碼吧,要麼這個代碼是多此一舉,
//要麼就是還在犯迷糊,參看你上面的代碼,我很難知道你這段是用來幹嘛的?
{
while(p2->next!=NULL)
p2=p2->next;
p2->next=p0;
}
p0->next=NULL;
return(head);
④ c語言,鏈表的反轉怎麼寫代碼
單鏈表反轉很簡單,只說下思路:
1,從頭到尾循環遍歷鏈表
2,取下頭結點,作為版尾結點,尾結點此時也為權頭結點
3,採用前插法,將步驟二中取下的結點一個一個連接到頭結點前面,成為新的頭結點。
4,鏈表全部遍歷完後,新的鏈表產生了,是原來鏈表的反轉。
⑤ 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語言將一個單鏈表倒置
扣著的是頭節點(頭子)
車是首節點(首子)
馬是次節點(次子)
牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。
根據步驟寫程序的偽演算法(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語言,鏈表的反轉,請寫出代碼,並講解下,謝了!!!!!
/*
0 2 4 6 8
8 6 4 2 0
Press any key to continue
*/
#include <stdio.h>
#include <stdlib.h>
#define ELTYPE int
typedef struct node {
ELTYPE m;
struct node *next;
} *NODE;
void InversionNode(NODE head) {
NODE p,t,q;
p = NULL;
t = head->next;
q = t->next;
if(t == NULL || q == NULL) return; // 空表和僅有一個結點的鏈表不用倒置
while(q) {
t->next = p; // 倒置結點
p = t; // p指向新倒置的結點
t = q; // 前進一個結點
q = q->next;
}
t->next = p; // 處理最後一個結點
head->next = t; // head指向倒置後的鏈表
}
void ShowNode(NODE head) {
NODE p = head->next;
for(;p;p = p->next) printf("%d ",p->m);
printf("\n");
}
NODE CreatNode(int n) { // 創建有頭結點的單向鏈表
int i;
NODE head,p,q;
head = p = (NODE)malloc(sizeof(node));
for(i = 0; i < n; ++i) {
q = (NODE)malloc(sizeof(node));
q->m = 2 * i;
p->next = q;
p = q;
}
p->next = NULL;
return head;
}
int main() {
NODE head = CreatNode(5);
ShowNode(head);
InversionNode(head);
ShowNode(head);
return 0;
}
⑧ 翻轉單向鏈表 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語言數據結構鏈表反轉
兩處scanf("%c",&data);後面都要加一行getchar();
另外代碼中的%s要改成%c
⑩ 單鏈表反轉的問題怎麼解決(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;
}