单链表倒数查找【C语言】
建立一个单链表 L,已知节点的data域为int ,请设计一个尽可能高效的算法,查找链表倒数第K个位置 的节点,并返回该节点的data域 。
#include <stdio.h>
#include <stdlib.h>
#define elemtype int
int num= 0 ;
typedef struct Node
{
elemtype data;
struct Node * next;
} Node;
typedef Node* Linklist;
void Initlist ( Linklist * L)
{
* L= ( Linklist) malloc ( sizeof ( Node) ) ;
( * L) -> next= NULL ;
}
void CreateFromTail ( Linklist L)
{
int i= 0 ;
Node * r= L, * s;
elemtype e;
while ( i!= num)
{
scanf ( "%d" , & e) ;
s= ( Node* ) malloc ( sizeof ( Node) ) ;
s-> data= e;
r-> next= s;
r= s;
i++ ;
}
r-> next= NULL ;
}
void CreateFromHead ( Linklist L)
{
Node * s;
int i= 0 ;
elemtype e;
while ( i!= num)
{
scanf ( "%d" , & e) ;
s= ( Node* ) malloc ( sizeof ( Node) ) ;
s-> data= e;
s-> next= L-> next;
L-> next= s;
i++ ;
}
}
void InsList ( Linklist L, int i, elemtype e)
{
Node * pre, * s;
pre= L;
int k= 0 ;
while ( pre!= NULL && k< i- 1 )
{
pre= pre-> next;
k= k+ 1 ;
}
if ( pre== NULL )
{
printf ( "插入位置不合理!" ) ;
return ;
}
s= ( Node* ) malloc ( sizeof ( Node) ) ;
s-> data= e;
s-> next= pre-> next;
pre-> next= s;
}
void DelList ( Linklist L, int i)
{
Node * pre, * r;
pre= L;
int k= 0 ;
while ( pre-> next!= NULL && k< i- 1 )
{
pre= pre-> next;
k= k+ 1 ;
}
if ( pre-> next== NULL )
{
printf ( "该位置不合理!\n" ) ;
return ;
}
r= pre-> next;
pre-> next= r-> next;
free ( r) ;
printf ( "已释放此结点!\n" ) ;
}
void Locate ( Linklist L, int J)
{
Node * p;
p= ( Node* ) malloc ( sizeof ( Node) ) ;
p= L-> next;
int i= 0 ;
if ( J> num|| J< 1 )
{
printf ( "该位置不合理!\n" ) ;
return ;
}
while ( i!= num- J)
{
p= p-> next;
i++ ;
}
printf ( "该结点的Data为:%d\n" , p-> data) ;
}
void view ( Linklist L)
{
printf ( "此链表为:\n" ) ;
Node * p;
p= L-> next;
while ( p!= NULL )
{
printf ( "%d " , p-> data) ;
p= p-> next;
}
printf ( "\n" ) ;
}
int main ( )
{
Linklist L;
Initlist ( & L) ;
printf ( "请您输入--元素的总个数:\n" ) ;
scanf ( "%d" , & num) ;
printf ( "若使用头插法请输入--'H'\n" ) ;
printf ( "若使用尾插法请输入--‘T’\n" ) ;
char I; scanf ( "%s" , & I) ;
printf ( "请您输入--元素:\n" ) ;
if ( I== 'H' )
{
CreateFromHead ( L) ;
}
else
{
CreateFromTail ( L) ;
}
view ( L) ;
printf ( "您想查找倒数第几个结点:\n" ) ;
int J= 0 ; scanf ( "%d" , & J) ;
Locate ( L, J) ;
printf ( "\nHello World!\n" ) ;
return 0 ;
}
请您输入-- 元素的总个数:
5
若使用头插法请输入-- 'H'
若使用尾插法请输入-- ‘T’
T
请您输入-- 元素:
1 2 3 4 5
此链表为:
1 2 3 4 5
您想查找倒数第几个结点:
3
该结点的Data为:3
Hello World!
Process returned 0 ( 0x0 ) execution time : 8.798 s
Press any key to continue .
Copyright © 2019 wyq. All rights reserved.