PTA-資料結構 求鏈式線性表的倒數第K項
阿新 • • 發佈:2018-12-11
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; }