给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。
实现这个算法,并为可能出现的特例情况安排好处理措施。
倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素将被返回:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int Length;
}SqList;
Status InitList(SqList *L)
{
L->Length=0;
return OK;
}
SqList Create(SqList * L)
{
int i;
srand((unsigned)time(NULL));
for(i=0; i < 10; i++)
{
L->data[i] = rand()%100;
L->Length++;
}
return *L;
}
//查找倒数第M个数,并返回其值
Status Search(SqList *L,ElemType M)
{
int StartNumber=1;
int EndNumber=StartNumber+M;
while(EndNumber!=L->Length)
{
++StartNumber;
++EndNumber;
}
return L->data[StartNumber-1];
}
void Print(SqList * L)
{
for(int i=0;i<L->Length-1;i++)
{
printf("%d ,",L->data[i]);
}
printf("%d\n",L->data[L->Length-1]);
printf("\n");
}
int main()
{
SqList L;
printf("初始化顺序表:\n");
InitList(&L);
Create(&L);
Print(&L);
printf("请输入倒数第M个数:\n");
int M;
scanf("%d",&M);
int Value=Search(&L,M);
printf("倒数第%d个数的值为:%d\n\n",M,Value);
return 0;
}