C语言用链表实现逆序输出

#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>

//定义链表节点
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *Linklist;

//创建链表
Linklist create(Linklist L)
{
int i,n; //i用于下面循环,n用来存放有效节点的字数
Linklist p;
printf("Please input N =");
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;
}

return L; //返回头节点 ;
}
//链表反转
Linklist ReverseList(Linklist L)
{

if(L->next!= NULL)
{
ReverseList(L->next);
printf("%d ", L->data);
}
return L;

}

Linklist put(Linklist L)
{
Linklist p;
p = L->next;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}

int main()
{
Linklist L;
L=NULL;
create(L);
ReverseList(L);
return 1;
}
create函数可以运行,但是Reverse函数运行不了,感觉是create函数有问题,但是找不出来

#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>

//定义链表节点
typedef struct LNode
{ int data;
  struct LNode *next;
} LNode, *Linklist;

//创建链表
Linklist create()
{ int i,n; //i用于下面循环,n用来存放有效节点的字数
  Linklist p,L;
  printf("Please input N =");
  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;
  }
  return L; //返回头节点 ;
}
//链表反转输出 
Linklist ReverseList(Linklist L,int st)    //st为1时输出结点数据
{ if(L->next!= NULL)
    ReverseList(L->next,1);
  if(st)printf("%d ", L->data);
  return L;
}

void put(Linklist L)
{ Linklist p;
  p = L->next;
  while(p != NULL)
  { printf("%d ", p->data);
    p = p->next;
  }
  printf("\n");
}

int main()
{ Linklist L;
  L=create();
  printf("A: "); put(L);
  printf("B: ");
  ReverseList(L,0);    //附加结点未保存数据,故第二参数为0
  return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-13
直接嵌套输出就可以了,利用递归会返回来的性质,在else里面递归,输出了最后一个节点的data之后,会一层一层往前输出。
void Find(LinkList L)
{
LNode*p=L;
if(p->next == NULL)
{
printf("%c",p->data);
}
else
{
Find(p->next);
printf("%c",p->data);
}
}
第2个回答  2018-11-26
你很优秀,继续加油吧。
第3个回答  2020-03-17

扣着的是头节点(头子)

车是首节点(首子)

马是次节点(次子)

牙签细的是指针指向,香头发黑的是指向,铁头细的是指向。

根据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:


以下是while循环(条件:香头指向不为空)

第一个循环把马弄到车前面,

第二个循环把相弄到马前面

第三个循环把士弄到相前面

........

直到香指向为空后停止循环。

代码如下:只需要一个首结点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:香头跟着铁头

}

自己用道具操作几遍,然后把流程背会,以后自己根据流程写代码即可。