C语言:用栈来逆置一个单链表,哪位大神能给出下面代码的详细的解释?谢谢

#include<stdio.h>#include<stdlib.h>#definestacksize100typedefintdatatype;typedefstruc... #include <stdio.h>
#include<stdlib.h>
#define stacksize 100
typedef int datatype;
typedef struct
{
datatype data[stacksize];
int top;
}seqstack;
typedef struct node
{
datatype data;
struct node *next;
}listnode;
typedef listnode *linklist;
linklist h;
linklist p;
int x;
linklist creatlist(int n)
{
linklist h;
listnode *p1,*p2;
int i;
h=(linklist)malloc(sizeof(listnode));
h->next=NULL; /*逆置单链表初始为空*/
p2=h;
printf("请输入链记录!:\n");
for(i=0;i<n;i++)
{
p1=(linklist)malloc(sizeof(listnode));
scanf("%d",&p1->data);
p1->next=p2->next; /*将当前处理节点p插入到逆置L的表头*/
p2->next=p1;
p2=p1; /*p指向下一个待插入的节点*/
}
return (h);
}
void print(linklist h,int n)
{
if(h==NULL)
printf("链表为空!\n");
printf("这%d个链记录是:\n",n);
p=h->next;
printf("%d",p->data);
x=1;
while(p->next!=NULL)
{
x++;
p=p->next;
printf("%4d",p->data);
if(!(x%10))
printf("\n");
}
}
datatype push(seqstack *s,int x)
{
if(s->top==stacksize-1)
printf("堆栈溢出!\n");
else
s->data[++s->top]=x;
}
datatype pop(seqstack *s)
{
if(s->top==-1)
printf("堆栈为空!\n");
else
return (s->data[s->top--]);
}
datatype deleted(linklist h)
{
datatype temp;
linklist p;
p=h->next;
temp=(p->data);
h->next=p->next;
free(p);
return (temp);
}
void invertedlist(linklist h,int n)
{
seqstack s;
int i,j,temp;
s.top=-1;
for(i=0;i<n;i++)
{
temp=deleted(h);
push(&s,temp);
}
for(i=0;i<n;i++)
{
temp=pop(&s);
printf("%5d",temp);
if(!((i+1)%10))
printf("\n");
}
printf("\n");
}
main()
{
linklist h;
int n;
printf("请输入n的值:\n");
scanf("%d",&n);
h=creatlist(n);
print(h,n);
printf("\n");
printf("经过逆置,链记录为:\n");
invertedlist(h,n);
system("pause");
return 0;
}
展开
 我来答
yun010203
推荐于2017-09-18 · 超过17用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:33.7万
展开全部

#include <stdio.h>
#include<stdlib.h>
#define stacksize 100
typedef int datatype;//这里所谓的datatype关键字是不存在的,所以这里用typedef (类型定义) 定义成int 型,意思是datatype 就是int
typedef struct
{
  datatype data[stacksize];
  int  top;
}seqstack;//这里定义了栈(其实就是结构体,里面有个int型的数组和int型的成员),在下面有栈的一些运算,


typedef struct node
{
  datatype  data;
  struct node *next;
}listnode;//这里定义了链表。int 型成员和 node * 指针



typedef listnode *linklist;//定义linklist指针,就是listnode 类型的指针
linklist h;
linklist p;
int x;


linklist creatlist(int n) //这里是创建链表
{
 linklist h;
 listnode *p1,*p2;
 int i;
 h=(linklist)malloc(sizeof(listnode));/*这里是为 h 这个结点(或者可称为结构体,它本来的面目),申请内存空间,大小就是(sizeof(listnode),就是结构体所占大小)*/


 h->next=NULL;    /*逆置单链表初始为空*/
 p2=h;
 printf("请输入链记录!:\n");


 for(i=0;i<n;i++)//这里就输入n个记录,比如1,2,3,4,5
 {
    p1=(linklist)malloc(sizeof(listnode));//同上
    scanf("%d",&p1->data);//输入该节点中的数据成员data的值
    p1->next=p2->next;  /*将当前处理节点p插入到逆置L的表头*/
    p2->next=p1;
    p2=p1; /*p指向下一个待插入的节点*/
 }
  return (h);
}


void print(linklist h,int n)//将该链表打印出来
{
 if(h==NULL)
          printf("链表为空!\n");
 printf("这%d个链记录是:\n",n);
 p=h->next;
 printf("%d",p->data);
 x=1;
 while(p->next!=NULL)
 {
     x++;
     p=p->next;
     printf("%4d",p->data);//这里就是P指针一直指向next, 循环打印,直到p=NULL..
     if(!(x%10))
            printf("\n");// - -这里应该是每打印10次就换行的意思。
 }
}
datatype push(seqstack *s,int x)   /*这里就是栈的操作,进栈,返回类型为datatype,实际上就是int,这里说下参数,第一个参数是指向栈的指针类型,第二个参数是你要进栈的值*/
{
 if(s->top==stacksize-1)//超出栈的大小
      printf("堆栈溢出!\n");
  else
            s->data[++s->top]=x;  
}
datatype pop(seqstack *s) //和上面相同,这个是出栈,return 栈的元素的值
{
  if(s->top==-1)
   printf("堆栈为空!\n");
  else
          return (s->data[s->top--]);
}
datatype deleted(linklist h)//删除链表结点的值,并将该结点中data值放到temp
{
   datatype temp;
   linklist p;
   p=h->next;
   temp=(p->data);
   h->next=p->next;
   free(p);//这步重要!释放结点所占的空间
   return (temp);
}
void invertedlist(linklist h,int n)//
{    
   seqstack s;
   int i,j,temp;
   s.top=-1;
   for(i=0;i<n;i++)//说白了就是将链表的值依次进栈
   {
      temp=deleted(h);
      push(&s,temp);  
   }
   for(i=0;i<n;i++)//然后将各个值依次出栈
   {
      temp=pop(&s);
      printf("%5d",temp);
      if(!((i+1)%10))
               printf("\n");
   }
   printf("\n");
}
main()
{
   linklist h;
   int n;
   printf("请输入n的值:\n");
   scanf("%d",&n);
   h=creatlist(n);
   print(h,n);
   printf("\n");
   printf("经过逆置,链记录为:\n");
   invertedlist(h,n);
   system("pause");
   return 0;
}

最后总结,原理就是利用栈的先进后出的特性来实现逆置的。有什么不懂可以再提问。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式