当前位置:首页 » 编程语言 » c语言链表逆序原理
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言链表逆序原理

发布时间: 2023-01-03 05:20:18

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>

//结构体,用整数作数据
typedef struct tNODE
{
int data;
struct tNODE *next;
}NODE;

//删除链表,回收空间
void clear(NODE *head)
{
NODE *p;
while(head)
{
p=head->next;//保存下一个结点的地址
free(head);//删除最先的一个结点
head=p;//指向下一个结点
}
}

//输出整个链表中的数据
void write(NODE *head)
{
NODE *p;
p=head->next;//因为使用带头结点的链表,所以要跳过第一个结点
while(p)
{
printf("%d ", p->data);
p=p->next;//后移
}
printf("\n");
}

//链表逆序
void reverse(NODE *head)
{
NODE *p, *q, *r;
if(head->next)//至少有一个数据
{
p=head->next;//p指向第一个数据结点
q=p->next;//q指向第二个结点
p->next=NULL;//第一个结点逆序后当然就是最后一个
while(q)
{
r=q->next;//r指向第三个结点
q->next=p;//第二个结点的链指针指向第一个
p=q;//p指向第二个结点
q=r;//q指向第三个结点
}
head->next=p;//让始终没理的头结点连到最后一个结点上
}
}

//生成链表,以-1表示结束
NODE *create()
{
NODE *h, *t;
int x;
h=malloc(sizeof(NODE));//建立头结点
t=h;
scanf("%d", &x);
while(x!=-1)
{
t->next=malloc(sizeof(NODE));
t=t->next;
t->data=x;
scanf("%d", &x);
}
t->next=NULL;
return h;
}

int main()
{
NODE *head;
head=create();
write(head);
reverse(head);
write(head);
clear(head);
return 0;
}