1. 程式人生 > >資料結構:單鏈表的就地逆置

資料結構:單鏈表的就地逆置

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. typedef int Status;

  9. typedef int ElemType; //假設線性表中的元素均為整型

  10. typedef struct LNode

  11. {

  12. ElemType data;

  13. struct LNode *next;

  14. }LNode,*LinkList;

  15. Status ListCreate_L(LinkList &L,int n)

  16. {

  17. LNode *rearPtr,*curPtr; //一個尾指標,一個指向新節點的指標

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

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

  20. L->next=NULL; //先建立一個帶頭結點的單鏈表

  21. rearPtr=L; //初始時頭結點為尾節點,rearPtr指向尾巴節點

  22. for (int i=1;i<=n;i++){ //每次迴圈都開闢一個新節點,並把新節點拼到尾節點後

  23. curPtr=(LNode*)malloc(sizeof(LNode));//生成新結點

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

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

  26. curPtr->next=NULL; //最後一個節點的next賦空

  27. rearPtr->next=curPtr;

  28. rearPtr=curPtr;

  29. }

  30. return OK;

  31. }

  32. void ListReverse_L(LinkList &L);

  33. void ListPrint_L(LinkList &L){

  34. //輸出單鏈表

  35. LNode *p=L->next; //p指向第一個元素結點

  36. while(p!=NULL)

  37. {

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

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

  40. else

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

  42. p=p->next;

  43. }

  44. }

  45. int main()

  46. {

  47. LinkList L;

  48. int n;

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

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

  51. printf("表建立失敗!!!\n");

  52. return -1;

  53. }

  54. ListReverse_L(L);

  55. ListPrint_L(L);

  56. return 0;

  57. }/* 請在這裡填寫答案 */

輸入格式:

第一行輸入一個整數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