方法一:先翻转链表,再顺序输出。
#include <stdio.h>
#include <stdlib.h>
typedef struct Num //声明结构体
{
int data;
struct Num *next;
}Num;
Num * createlink(n) //创建链表
{
if (n<1)
{
return NULL;
}
int i=0;
Num *p=(Num *)malloc(sizeof(Num));
p->data=i+1;
p->next=NULL;
Num *head=p;
for(;i<n-1;)
{
i++;
p->next=(Num *)malloc(sizeof(Num));
p->next->data=i+1;
p->next->next=NULL;
p=p->next;
}
return head;
}
Num * reverse(Num *p) //逆置链表
{
Num *r=NULL,*s = NULL;
while (p!=NULL)
{
r=p->next;
p->next=s;
s=p;
p=r;
}
return s;
}
void printlink(Num *p) //打印链表
{
for(;p!=NULL;)
{
printf("%d\n",p->data);
p=p->next;
}
}
void freelink(Num *p) //释放空间
{
for(;p==NULL;)
{
free(p);
p=p->next;
}
}
int main(int argc, const char * argv[])
{
int n;
Num *p;
printf("请输入需要创建的链表长度:");
scanf("%d",&n);
p=createlink(n);
printlink(p);
free(p);
return 0;
}
方法二:递归实现。
#include <stdio.h>
#include <stdlib.h>
typedef struct Num//定义结构体
{
int data;
struct Num *next;
}Num;
Num * greatelink(int n)//创建链表
{
int i=0;
if(n<1)
{
return NULL;
}
Num *p = (Num *)malloc(sizeof(Num));
Num *head=p;
p->data=i+1;
p->next=NULL;
while(i<n-1)
{
i++;
p->next = (Num *)malloc(sizeof(Num));
p->next->data=i+1;
p->next->next=NULL;
p=p->next;
}
return head;
}
void reprintlink(Num *p)//递归逆序输出
{
if(p==NULL)
{
return;
}
reprintlink(p->next);
printf("%d\n",p->data);
}
void freelink(Num *p)
{
while(p==NULL)
{
free(p);
p=p->next;
}
}
int main(int argc, const char * argv[])
{
int n;
Num *p;
printf("请输入需要创建的链表大小:");
scanf("%d",&n);
p=greatelink(n);
reprintlink(p);
free(p);
return 0;
}
方法三:借用栈或者数组倒序输出链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct Num
{
int data;
struct Num *next;
}Num;
Num * createlink(n)
{
if (n<1)
{
return NULL;
}
int i=0;
Num *p=(Num *)malloc(sizeof(Num));
p->data=i+1;
p->next=NULL;
Num *head=p;
for(;i<n-1;)
{
i++;
p->next=(Num *)malloc(sizeof(Num));
p->next->data=i+1;
p->next->next=NULL;
p=p->next;
}
return head;
}
void freelink(Num *p)
{
for(;p==NULL;)
{
free(p);
p=p->next;
}
}
int main(void)
{
int n;
Num *p,*q;
int top=0;
printf("请输入需要创建的链表的长度:");
scanf("%d",&n);
Num *stack[n];
p=createlink(n);
q=p;
for(;q!=NULL;)
{
stack[top++]=q;
q=q->next;
}
for (; top>0;)//出栈
{
top--;
printf("%d\n",stack[top]->data);
}
freelink(p);
return 0;
}