7-3 求链式线性表的倒数第K项

来源:互联网 发布:人工智能取代数据分析 编辑:程序博客网 时间:2024/06/01 08:00

给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:

输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:

输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:

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

输出样例:

7

有一个一分的bug,没有改出来,欢迎大佬指点
代码:

#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef int status;typedef int ElemType;typedef struct LNode {    struct LNode * next;    ElemType data;}LNode,*Linklist;//状态码定义#define    TRUE    1#define    FALSE   0#define    OK      1#define    ERROR   0#define    OVERFLOW    -2status CreatList_L(Linklist & L) {    LNode* temp, *rearPtr;    temp = (LNode* )malloc (sizeof(LNode));    if(!temp) exit(OVERFLOW);    L = temp;    rearPtr = L;    int num;    while(scanf("%d",&num)) {        temp = (LNode* )malloc (sizeof(LNode));        if(!temp) exit(OVERFLOW);        temp->data = num;        rearPtr->next = temp;        rearPtr = rearPtr->next;        if(num < 0) break;    }    return OK;}int main(){    //创建链表    Linklist  L;    int k;    scanf("%d",&k);    if(CreatList_L(L) != OK) {        printf("链表创建失败!\n");        return -1;    }    //创建两个指针,一个指针指向第K个元素,另一个指针指向头结点    LNode* fristPtr, * secondPtr;    fristPtr = L;    secondPtr = L;    int i;    for(i = 0; i < k && fristPtr; i ++) {        fristPtr = fristPtr->next;    }    //两个指针同时后移,当第一个指针为空时,取另一指针的元素    while(fristPtr->data >= 0) {        fristPtr = fristPtr->next;        secondPtr = secondPtr->next;    }    //检验链表是否为空,空输出NULL,非空输出第K个元素    if(secondPtr == NULL || k <= 0)        printf("NULL\n");    else        printf("%d\n",secondPtr->data);        //printf("test here : fristPtr->data is %d,secondPtr->data is %d\n",fristPtr->data,secondPtr->data);    return 0;}
原创粉丝点击