6-1 单链表逆转 (20分)

 

//以下是调试代码:

 

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
   PtrToNode Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
   L1 = Read();
   L2 = Reverse(L1);
   Print(L1);
   Print(L2);
  return 0;
}


List Read()
{
   int n,i;
  scanf("%d",&n);
  struct Node *head=NULL,*s,*r=NULL;
  head=(List *)malloc(sizeof(List));
  if(head==NULL)
{
   exit(1);
}
  r=head;
  s=(List *)malloc(sizeof(List));

  if(s==NULL)
{
   exit(1);
}
for(i=0;i<n;i++)
{
   s=(List *)malloc(sizeof(List));
   scanf("%d",&s->Data);
  if(s==NULL)
 {
  exit(1);
 }
  r->Next=s;
  r=r->Next;
 }

  r->Next=NULL;
  return head->Next;//返回的是一个不带头结点的链表

  }
void Print( List L )//输出不带头结点的链表
{
   struct Node *p;
  p=L;
  while(p)
{
  printf("%d ",p->Data);
  p=p->Next;
}
   printf("\n");
}

 

List Reverse( List L )
{
struct Node *Lcopy=NULL,*temp=NULL,*p,*q;

p=L;

while(p)
{
  q=p->Next;
  p->Next=Lcopy;
  Lcopy=p;
  p=q;


   //temp=L->Next;
   //L->Next=Lcopy;
   //Lcopy=L;
   //L=temp;
}
return Lcopy;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//这道题目输出样例中第一行中的那个1确实不太清楚,后来不带头结点就对了。我也是个渣渣。

/* 你的代码将被嵌在这里 */

 

//以下是AC代码
//重新定义一个链表,遍历链表时重新建立头插法一个单链表
List Reverse( List L )
{
struct Node *Lcopy=NULL,*temp=NULL,*p,*q;

p=L;

while(p)
{
  q=p->Next;
  p->Next=Lcopy;
  Lcopy=p;
  p=q;


   //temp=L->Next;
   //L->Next=Lcopy;
   //Lcopy=L;
   //L=temp;
}
return Lcopy;
}

posted @ 2020-04-19 15:07  努力的薇薇啊  阅读(359)  评论(0)    收藏  举报