当前位置:首页 » 编程语言 » 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;
}

热点内容
c语言fread返回值 发布:2025-07-12 16:57:32 浏览:678
王者荣耀在哪里显示账号密码 发布:2025-07-12 16:36:42 浏览:898
打包sql数据库 发布:2025-07-12 16:19:27 浏览:797
php日志查看 发布:2025-07-12 16:12:10 浏览:214
ftp目录映射为本地盘符 发布:2025-07-12 16:06:59 浏览:645
nas存储百科 发布:2025-07-12 16:03:17 浏览:126
python的sort函数 发布:2025-07-12 15:53:21 浏览:50
ensp服务器怎么设置web根目录 发布:2025-07-12 15:47:56 浏览:286
安卓怎么设置二卡发信息 发布:2025-07-12 15:43:50 浏览:743
如何看到无线密码 发布:2025-07-12 15:43:13 浏览:677