❶ 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;
}