直接上代码:
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct list {
DataType data;
struct list *next;
}SeqList;
int main(){
int num;
int i=1;
//链表的从无到有的插入需要三个指针,头指针,临时指针和。。。
SeqList *head,*p,*temp;
//开辟指针空间
temp=(SeqList*)malloc(sizeof(SeqList));
scanf("%d",&num);
//从键盘中输入第一个数据
scanf("%d",&(temp->data));
//开辟下一个NULL空间,
temp->next=NULL;
//将这个临时指针的值赋给头指针
p=head=temp;
//根据题意可知,输入是以负数作为截止,如果前一个数大于0,那么进入循环
while(temp->data>=0){
//再重新开辟一个指针空间?
temp=(SeqList*)malloc(sizeof(SeqList));
//再进行从键盘输入
scanf("%d",&(temp->data));
//如果这个数据小于0,那么退出循环
if(temp->data<0){
//delete temp; //释放内存
break;
}
else{
//否则,开辟一个NULL空间,不开辟就越界
temp->next=NULL;
//将p作为这个链表的实际运作指针
p->next=temp;
p=temp;
}
}
//计算这个链表的实际长度,自然要从头开始,这个while循环条件的意思是
// 指针p所指节点中的成员next的是值,若该值为下一个节点的地址即循环条件为真,若是0或NULL 则循环条件为假.
p=head;
// printf("%d\n",head->data);
while(p->next){
i++;
p=p->next;
}
int h=i;
//因为头结点也存放数据了所以我的i是从1开始
// printf("%d\n",h);
// 如果倒数第num个元素大于链表的长度或者是负数,那么逻辑错误
if(num>h||num<=0){
printf("NULL");
return 0;
}
p=head;
//找到倒数第num个元素
for(int j=0;j<i-num;j++){
p=p->next;
}
printf("%d",p->data);
return 0;
}