题目:输入链表的头结点,从尾到头打印出所有结点的值。(倒序输出链表)
一般有两种办法,
一:利用栈的“后进先出”的特性,把链表每个结点都放到栈里面,然后再出栈输出。
下面是实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void InitStack(STACK* s); /*初始化栈*/
void Push(STACK* s,int e); /*进栈*/
void Pop(STACK* s,int *e); /*出栈*/
int StackEmpty(STACK *s); /*判断是否空栈*/
void readlist_end(LinkList L); /*主要处理函数,用于把链表数据进栈,然后出栈*/
void echo_list(LinkList L,int flag); /*用于输出链表数据*/
LinkList creat_list(int len); /*创建链表*/
typedef struct node
{
int data;
struct node* next;
}Lnode,*LinkList;
typedef struct stack
{
LinkList top;
}STACK;
int StackEmpty(STACK *s)
{
if(s->top==NULL)
return 1;
else
return 0;
}
void InitStack(STACK *s)
{
s->top=NULL;
}
void Push(STACK *s,int e)
{
LinkList l;
l=(LinkList)malloc(sizeof(Lnode));
l->data=e;
l->next=s->top;
s->top=l;
}
void Pop(STACK *s,int *e)
{
LinkList l;
if(StackEmpty(s))
exit(-1);
l=s->top;
*e=l->data;
s->top=l->next;
free(l);
}
void readlist_end(LinkList L)
{
STACK s;
InitStack(&s);
LinkList p;
int e;
p=L;
while(p!=NULL)
{
Push(&s,p->data);
p=p->next;
}
while(s.top!=NULL)
{
Pop(&s,&e);
printf("%d ",e);
}
printf("\n");
}
/*
* LinkList:链表
* flag
* 1:释放空间
* other:只输出,不错处理.
* */
void echo_list(LinkList L,int flag)
{
LinkList p;
LinkList m;
p=L;
while(p!=NULL)
{
printf("%d ",p->data);
m=p;
p=p->next;
if(flag==1)
{
free(m);
}
}
printf("\n");
}
LinkList creat_list(int len)
{
int i;
LinkList l;
LinkList p;
LinkList m;
l=(LinkList)malloc(sizeof(Lnode));
l->data=0;
l->next=NULL;
m=l;
for(i=1;i<len;i++)
{
p=(LinkList)malloc(sizeof(Lnode));
p->data=i;
p->next=NULL;
m->next=p;
m=p;
}
m->next=NULL;
return 0;
}
int main()
{
LinkList L;
L=creat_list(10);
printf("逆序后数据:");
readlist_end(L);
printf("原始数据:");
echo_list(L,1);
return 0;
}
二:利用递归特性进行输出,先递归再输出数据(收到递归层数影响,数据量太大就不行了,但是代码简单)
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int data;
struct node* next;
}Lnode,*LinkList;
LinkList creat_list(int len)
{
int i;
LinkList l;
LinkList p;
LinkList m;
l=(LinkList)malloc(sizeof(Lnode));
l->data=0;
l->next=NULL;
m=l;
for(i=1;i<len;i++)
{
p=(LinkList)malloc(sizeof(Lnode));
p->data=i;
p->next=NULL;
m->next=p;
m=p;
}
m->next=NULL;
return l;
}
void readlist_end(LinkList L)
{
if(L->next!=NULL)
readlist_end(L->next);
printf("%d ",L->data);
}
/*LinkList:the link table.
**flag
** 1:free the memery.
** other:not free the memery.
***/
void echo_list(LinkList L,int flag)
{
LinkList p;
LinkList m;
p=L;
while(p!=NULL)
{
printf("%d ",p->data);
m=p;
p=p->next;
if(flag==1)
{
free(m);
}
}
printf("\n");
}
int main()
{
LinkList L;
L=creat_list(10);
readlist_end(L);
printf("\n");
echo_list(L,1);
return 0;
}
如果有哪地方不对,请及时帮我指出,免得误导大家。