5-19 求链式线性表的倒数第K项 (20分)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
#include<stdio.h> #include<algorithm> #include<stdlib.h> using namespace std; struct Node{ int num; struct Node *last; struct Node *next; }; typedef struct Node *PNODE; int q = 0;/*记录链表结点的个数*/ PNODE Create()/*建立一个双向链表*/ { PNODE t,PTile,phead = (PNODE)malloc(sizeof(struct Node)); phead->last = NULL; phead->next = NULL; PTile = phead; int number; do{ scanf("%d",&number); if(number >= 0) { PNODE pnew = (PNODE)malloc(sizeof(struct Node)); pnew->num = number; pnew->last = PTile; pnew->next = NULL; PTile->next =pnew; PTile = pnew; q++; } }while(number >= 0); t = phead; phead = phead->next; free(t); return PTile; } void print(PNODE p, int n,int q) { for(int i = 1; i < n; i++) { p = p->last; } if(n > q || n == 0)/*当n大于链表结点数的时候或n = 0的情况,要输出NULL*/ { printf("NULL\n"); } else { printf("%d",p->num); } } int main(void) { int n; scanf("%d",&n); PNODE p = Create(); print(p,n,q); return 0; }