数据结构:单链表的就地逆置

6-1 带头结点的单链表就地逆置(10 分)
 

本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数。L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置,如原单链表元素依次为1,2,3,4,则逆置后为4,3,2,1。

函数接口定义:

void ListReverse_L(LinkList &L);

其中 L 是一个带头结点的单链表。

裁判测试程序样例:


 

//库函数头文件包含

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

 

  1. //函数状态码定义

  2. #define TRUE 1

  3. #define FALSE 0

  4. #define OK 1

  5. #define ERROR 0

  6. #define INFEASIBLE -1

  7. #define OVERFLOW -2

  8.  
  9. typedef int Status;

  10. typedef int ElemType; //假设线性表中的元素均为整型

  11.  
  12. typedef struct LNode

  13. {

  14. ElemType data;

  15. struct LNode *next;

  16. }LNode,*LinkList;

  17.  
  18. Status ListCreate_L(LinkList &L,int n)

  19. {

  20. LNode *rearPtr,*curPtr; //一个尾指针,一个指向新节点的指针

  21. L=(LNode*)malloc(sizeof (LNode));

  22. if(!L)exit(OVERFLOW);

  23. L->next=NULL; //先建立一个带头结点的单链表

  24. rearPtr=L; //初始时头结点为尾节点,rearPtr指向尾巴节点

  25. for (int i=1;i<=n;i++){ //每次循环都开辟一个新节点,并把新节点拼到尾节点后

  26. curPtr=(LNode*)malloc(sizeof(LNode));//生成新结点

  27. if(!curPtr)exit(OVERFLOW);

  28. scanf("%d",&curPtr->data);//输入元素值

  29. curPtr->next=NULL; //最后一个节点的next赋空

  30. rearPtr->next=curPtr;

  31. rearPtr=curPtr;

  32. }

  33. return OK;

  34. }

  35. void ListReverse_L(LinkList &L);

  36. void ListPrint_L(LinkList &L){

  37. //输出单链表

  38. LNode *p=L->next; //p指向第一个元素结点

  39. while(p!=NULL)

  40. {

  41. if(p->next!=NULL)

  42. printf("%d ",p->data);

  43. else

  44. printf("%d",p->data);

  45. p=p->next;

  46. }

  47. }

  48. int main()

  49. {

  50. LinkList L;

  51. int n;

  52. scanf("%d",&n);

  53. if(ListCreate_L(L,n)!= OK) {

  54. printf("表创建失败!!!\n");

  55. return -1;

  56. }

  57. ListReverse_L(L);

  58. ListPrint_L(L);

  59. return 0;

  60. }/* 请在这里填写答案 */

输入格式:

第一行输入一个整数n,表示单链表中元素个数,接下来一行共n个整数,中间用空格隔开。

输出格式:

输出逆置后顺序表的各个元素,两个元素之间用空格隔开,最后一个元素后面没有空格。

输入样例:

4
1 2 3 4

输出样例:

4 3 2 1

 

void ListReverse_L(LinkList &L)  

{  

    LNode *p=L->next,*q;  

    L->next=NULL;  

    while(p!=NULL)  

   {  

        q=p->next;  

        p->next=L->next;  

        L->next=p;  

       p=q;  

    }  

}  

/*思路:①将原来的头结点拆下来,作为新的逆置链表的头结点 

          ②将原来链表的各个节点,依次拆卸下来,然后按照头插法,插入到逆置链表当中 

          ③循环,直到原来的链表为空即可。*/</code>  

--------------------- 本文来自 sensen426521 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sensen426521/article/details/78243606?utm_source=copy

posted @ 2018-10-07 11:56  zw1sh  阅读(1300)  评论(1编辑  收藏  举报