天天看點

習題3.5 求連結清單的倒數第m個元素 (20 分)

請設計時間和空間上都盡可能高效的算法,在不改變連結清單的前提下,求鍊式存儲的線性表的倒數第m(>0)個元素。

函數接口定義:
ElementType Find( List L, int m );
其中List結構定義如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存儲結點資料 */
    PtrToNode   Next; /* 指向下一個結點的指針 */
};
typedef PtrToNode List; /* 定義單連結清單類型 */
L是給定的帶頭結點的單連結清單;函數Find要将L的倒數第m個元素傳回,并不改變原連結清單。如果這樣的元素不存在,則傳回一個錯誤标志ERROR。

裁判測試程式樣例:
#include <stdio.h>
#include <stdlib.h>

#define ERROR -1

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

List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表 */

ElementType Find( List L, int m );

int main()
{
    List L;
    int m;
    L = Read();
    scanf("%d", &m);
    printf("%d\n", Find(L,m));
    Print(L);
    return 0;
}

/* 你的代碼将被嵌在這裡 */
輸入樣例:
5
1 2 4 5 6
3
輸出樣例:
4
1 2 4 5 6 
           

代碼如下

ElementType Find( List L, int m )
{
    List t;
    int i=0,j=0;
    t=L;
    while(t->Next!=NULL)
    {
        t=t->Next;
        i++;
    }
    if(i<m)
        return ERROR;
    else
    {
        t=L;
        for(j=0;j<i-m+1;j++)
        {
            t=t->Next;
        }
        return t->Data;
    }
}
           

注意:

  1. 因為題目中最後要傳回L,是以要新建立一個指針用來指向結構體中的每個結點
  2. 思路:先讓指針t從頭結點不斷向後移動用計數器i來記錄連結清單中有多少個結點,然後判斷,如果m>i則說明要傳回的元素不存在。反之存在:讓指針t重新指向頭結點,對于倒數的第m個元素就是整數的第i-m+1個元素,然後用循環讓指針不斷向後☞,最後傳回該元素

繼續閱讀