问答题 设计一个算法,将结点数据域依次是a1,a2,…,an(n≥0)的一个单链表的所有结点逆置,即第一个结点的数据域变为an,最后一个结点的数据域变为a1
【正确答案】算法由主函数和创建单链表、就地逆转、输出四个函数组成。
   程序如下:
   #include<stdio.h>
   typedef struct node
   {
     int data;
     struct node*next;
   }Node;
   Node*create()    /*创建单链表,返回一个指向链表表头结点的
                   指针head*/
   {
     Node*head,*q,*p;    /*定义指针变量*/
     int a,n;    /*链表大小为n*/
     scanf(”/%d”,&n);
     head=(Node,*)malloc(sizeof(Node));/*申请新的存储空间,建立表头结点*/
   head->data=n;
   q=head;
   while(n>0)
   {
     scanf("/%d",&a);    /*输入新元素*/
   p=(Node*)malloc(sizeof(Node));
   p->data=a;
   q->next=p;
   q=p;
   n=n-1;
 }
   q->next=NULL;
   return(head);    /*返回表头指针head*/
 }
 void print(Node*head)    /*输出单链表各元素*/
 {
   Node*p;
   P=head->next;
   while(p!=NULL)
   {
     printf("/%d",p->data);
     p=p->next;
   }
   printf("\n");
 }
 int Jdnz(Node{head)    /{单链表各元素就地逆转杀/
 {
   Node*p,*q,*r;
   if(((head->next)==NULL)‖(((head->next)->next)==NULL))
     return(1);    /*如果单链表为空或只有一个结点,不做就地逆转,返回1*/
   else    /*由p,q,r三个指针边访问单链表结点,边完成逆转*/
   {
     r=head->next;
     q=r;
     r=r->next;
     do
   {
     p=q;
     q=r;
     r=r->next;
     q->next=p;
    }while(r!=NULL);
   }
   (head->next)->next=NULL;
   head->next=q;
   return(0);
 }
 main()
 {
   Node*a;
   a=create();
   print(a);
   jdnz(a);
   print(a);
 }
   输出结果为:
   5(回车)    /*输入单链表的大小为5*/
   1 2 3 4 5(回车)    /*输入单链表的5个结点值*/
   1 2 3 4 5    /*输出单链表各结点值*/
   5 4 3 2 1    /*就地逆转后再输出单链表各结点值*/
【答案解析】