6-4 链式表的按序号查找 (10分)

本题要求实现一个函数,找到并返回链式表的第K个元素。

函数接口定义:

ElementType FindKth( List L, int K );

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

L是给定单链表,函数FindKth要返回链式表的第K个元素。如果该元素不存在,则返回ERROR。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR -1
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

List Read(); /* 细节在此不表 */

ElementType FindKth( List L, int K );

int main()
{
    int N, K;
    ElementType X;
    List L = Read();
    scanf("%d", &N);
    while ( N-- ) {
        scanf("%d", &K);
        X = FindKth(L, K);
        if ( X!= ERROR )
            printf("%d ", X);
        else
            printf("NA ");
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 3 4 5 2 -1
6
3 6 1 5 4 2

输出样例:

4 NA 1 2 5 3

ElementType FindKth( List L, int K ) 
{
    List p=L;
    if(K<=0)//K<=0,应该输出ERROR
    	return ERROR;
    else
	    for(int i=1;p&&i<K;i++)
	    {
	        p=p->Next;
	    }   
    if(p==NULL)
        return ERROR;
    return p->Data;
}

写的简短一点

ElementType FindKth( List L, int K ) 
{
    List p=L;
    while(p&&--K)//K<=0包括了
    {   
        p=p->Next;
    }   
    if(p==NULL)
        return ERROR;
    return p->Data;
}

完整代码

#include <stdio.h>
#include <stdlib.h>

#define ERROR -1
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

List Read(void);
ElementType FindKth( List L, int K );
void Delete(List L);

int main(void)
{
    int N, K;
    ElementType X;
    List L = Read();
    scanf("%d", &N);
    while ( N-- )
    {   
        scanf("%d", &K);
        X = FindKth(L, K);
        if ( X!= ERROR )
            printf("%d ", X);
        else
            printf("NA ");
    }
    Delete(L);
    return 0;
}
void Delete(List L)
{
    List p=L;
    while(p!=NULL)
    {
        L=p->Next;
        free(p);
        p=L;
    }
}
List Read(void)
{
    int num;
    List head=(List)malloc(sizeof(List));
    if(head==NULL)//没分配到
    {   
        puts("Don`t have memory");
        exit(EXIT_FAILURE);
    }   
    List record=head;
    for(int i=0;;i++)
    {   
        scanf("%d",&num);
        if(num==-1)
            break;
        if(i==0)//保证头结点可用
        {
            record->Data=num;
            record->Next=NULL;
        }
        else
        {
            List p=(List)malloc(sizeof(List));
            if(p==NULL)
           {
                puts("Don`t have memory");
                exit(EXIT_FAILURE);
            }
            p->Data=num;
            p->Next=NULL;
            record->Next=p;//把新结点接上
            record=p;//record后移指向新结点
        }
    }
    return head;
}
ElementType FindKth( List L, int K )
{
    List p=L;
    while(p&&--K)
    {
        p=p->Next;
    }
    if(p==NULL)
        return ERROR;
    return p->Data;
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页