求链表的倒数第m个元素

来源:互联网 发布:小米网络放大器怎么用 编辑:程序博客网 时间:2024/05/30 04:38

习题3.5 求链表的倒数第m个元素   (20分)

请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0>0)个元素。

函数接口定义:

ElementType Find( List L, int m );

其中List结构定义如下:

typedef struct Node *PtrToNode;struct Node {    ElementType Data; /* 存储结点数据 */    PtrToNode   Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */

L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR

裁判测试程序样例:

#include <stdio.h>#include <stdlib.h>#define ERROR -1typedef int ElementType;typedef struct Node *PtrToNode;struct Node {    ElementType Data;    PtrToNode   Next;};typedef PtrToNode List;List Read(); /* 细节在此不表 */void Print( List L ); /* 细节在此不表 */ElementType Find( List L, int m );int main(){    List L;    int m;    L = Read();    scanf("%d", &m);    printf("%d\n", Find(L,m));    Print(L);    return 0;}/* 你的代码将被嵌在这里 */

输入样例:

51 2 4 5 63

输出样例:

41 2 4 5 6

#include <stdio.h>#include <stdlib.h>#define ERROR -1#define N 20typedef int ElementType;typedef struct Node *PtrToNode;struct Node {    ElementType Data;    PtrToNode   Next;};typedef PtrToNode List;List Read(); void Print( List L ); ElementType Find( List L, int m );ElementType Length( List L);int main(){    List L;    int m;    L = Read();    scanf("%d", &m);    printf("%d\n", Find(L,m));    Print(L);    return 0;}ElementType Find( List L, int m ){int i=0,n, findWhich;List h,p;h=L;p=h->Next;n = Length(L);findWhich = n-m+1;/* 将倒数转换为正数第几个数*/while(p){i++;if(i==findWhich)break;p=p->Next;}return p->Data;}ElementType Length( List L){int len=0;List h,p;h=L;p=h->Next;while(p){len++;p=p->Next;}return len;}List Read(){      int a[N],i,n;      List h,p,q;        scanf("%d", &n);      for(i=0;i<n;i++)          a[i]=2*i+1;      for(i=0;i<n;i++)         printf("%d ", a[i]);     printf("\n");        h=(List)malloc(sizeof(struct Node));      h->Next=NULL;        p=q=h;      for(i=0;i<n;i++){          q=(List)malloc(sizeof(struct Node));          q->Data=a[i];          q->Next=NULL;          p->Next=q;          p=q;      }      p->Next=NULL;        return h;  }  void Print( List L ){      List p;            p=L->Next;      while(p){          printf("%d ", p->Data);          p=p->Next;      }      printf("\n");    }  





原创粉丝点击