当前位置:首页 » 编程语言 » 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;
}
热点内容
服务器ip转载 发布:2025-02-12 05:19:12 浏览:296
oraclesql插入数据 发布:2025-02-12 05:19:05 浏览:918
stl源码剖析笔记 发布:2025-02-12 05:01:51 浏览:589
教务系统web服务器搭建 发布:2025-02-12 05:01:17 浏览:98
全国dns服务器地址大全 发布:2025-02-12 05:01:13 浏览:683
安卓什么软件能拍到月亮 发布:2025-02-12 04:59:42 浏览:782
手机卡忘记服务密码怎么办 发布:2025-02-12 04:59:10 浏览:374
如何让助理服务器可以被远程 发布:2025-02-12 04:47:11 浏览:770
存储空间不足但 发布:2025-02-12 04:46:27 浏览:278
树莓派编程板 发布:2025-02-12 04:41:45 浏览:909