1. 程式人生 > >PTA-資料結構 求鏈式線性表的倒數第K項

PTA-資料結構 求鏈式線性表的倒數第K項

7-24 求鏈式線性表的倒數第K項 (20 分)

給定一系列正整數,請設計一個儘可能高效的演算法,查詢倒數第K個位置上的數字。

輸入格式:

輸入首先給出一個正整數K,隨後是若干正整數,最後以一個負整數表示結尾(該負數不算在序列內,不要處理)。

輸出格式:

輸出倒數第K個位置上的資料。如果這個位置不存在,輸出錯誤資訊NULL

輸入樣例:

4 1 2 3 4 5 6 7 8 9 0 -1

輸出樣例:

7

 思路:設兩個指標p_left與p,先讓p移動到第k個元素節點,p_left指向首元素節點。之後,p走到尾節點時,p_left正好走到倒數第k個節點。注意特殊情況,如節點數量小於k時的處理。

//庫函式標頭檔案包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函式狀態碼定義
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode* next;
}LNode,*Linklist;

Status ReadList(Linklist L)
{
    Linklist p = L;
    ElemType e;
    while(scanf("%d",&e)!=EOF && e>=0)
    {
        Linklist pNew = (Linklist)malloc(sizeof(LNode));
        if(!pNew)
            exit(OVERFLOW);
        pNew->data = e;
        pNew->next = NULL;
        p->next = pNew;
        p = p->next;
    }
    return OK;
}

void PrintLastK(Linklist L,int k)
{
    Linklist p_Left = L;
    Linklist p = L;
    int i=0;
    for(i=0;i<k;i++)
    {
        p = p->next;
        if(!p)
            break;
    }
    if(!p)
        printf("NULL\n");
    else
    {
        while(p)
        {
            p = p->next;
            p_Left = p_Left->next;
        }
        printf("%d\n",p_Left->data);
    }
}

int main()
{
    Linklist L;
    L = (Linklist)malloc(sizeof(LNode));
    if(!L)
        exit(OVERFLOW);
    L->next = NULL;

    int k;
    scanf("%d",&k);
    ReadList(L);
    PrintLastK(L,k);
    return 0;
}