#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std ;
typedef int ElemType ;
// 单链表的节点类型
typedef struct LNode{
ElemType data ; // 数据域
struct LNode *next ; // 指针域
}LinkNode ;
// 头插法建立单链表
void CreateListF(LinkNode *&L ,ElemType a[] ,int n){
LinkNode *s ;
L = (LinkNode*)malloc(sizeof(LinkNode)) ; // 头结点
L->next = NULL;
for(int i = 0 ; i<n ; i++ ) {
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i] ;
s->next = NULL ;
s->next = L->next ; // 将新节点插在头结点后面
L->next = s ;
}
}
// 尾插法建立单链表
void CreateListR(LinkNode *&L ,ElemType a[] ,int n ) {

LinkNode *s ,*r ;
L = (LinkNode*)malloc(sizeof(LinkNode)) ;
L->next = NULL ;
r = L ; //r始终指向终端结点,开始时指向头结点

for(int i = 0 ; i<n ; i++ ) {
s = (LinkNode*)malloc(sizeof(LinkNode)) ;
s->data = a[i] ;
s->next = NULL ;
r->next = s ;
r = s ;
}
r->next = NULL ;
return ;
}

// 按照序号查找节点的值
LNode *GetElem(LinkNode *L,int i ,ElemType &e) {

LinkNode *p = L->next ;
int j = 1 ;
if(i<=0 ) return NULL ;

while(p&&j<i){
p = p->next ;
j++ ;
}
if(p == NULL) {
// 没有这样的节点
return NULL ;
}else{
e = p->data;
return p ;
}

}
// 按照值查找节点
LNode *LocateElem(LinkNode *L , ElemType e) {
LinkNode *p = L->next ;
bool flag = false ;
while(p) {
if(p->data == e){
flag = true ;
break ;
}
p = p->next ;
}
if(flag) return p ;
else return NULL; // 没有找到这样的节点
}
// 插入操作
bool ListInsert(LinkNode *&L , int i ,ElemType e){
// 在单链表的第i个位置插入e
int j = 0 ;
LinkNode *p = L ,*s ;
if(i<=0 ) return false ; // 插入参数不对
// 1. 先找第 i-1 个节点
while(j<i-1 && p) {
j++ ;
p = p->next ;
}
if(p == NULL) return false ; // 未找到位序为i-1的位序
else {
s = (LinkNode*)malloc(sizeof(LinkNode)) ;
s->data = e ;
s->next = p->next ;
p->next = s ;
return true ; // 插入成功
}

}
// 删除某一节点

bool ListDelete(LinkNode *&L , int i , ElemType &e) {
int j = 0 ;
LinkNode *p = L , *q ;
if(i<=0 ) return false ;
while(j<i-1 && p){
p = p->next ;
j++;
}
if(p == NULL ) return false ;
else {
q = p->next ; // 要删除的节点
if(q == NULL) return false ;
e = q->data ; // 获取到要删除的节点
p->next = q->next ;
free(q) ;
return true ;
}

}
bool ListEmpty(LinkNode *L)
{
return(L->next==NULL);
}
int ListLength(LinkNode *L)
{
LinkNode *p=L;
int i= 0;
while (p->next!=NULL)
{ i++;
p=p->next;
}
return(i);
}
void DestroryList(LinkNode *&L) {
LinkNode *pre = L ,*p=pre->next ;
while(p) {
free(pre) ;
pre = p ;
p = p->next ;
}
free(pre) ;
}
void PrintLink(LinkNode *L) {
LinkNode *p = NULL;
p = L->next ;
while(p) {
cout<<p->data <<" " ;
p = p->next ;
}
return ;
}
int main() {

ElemType e = 0 ;
LinkNode *L = NULL ;
ElemType a[100] ;
for(int i = 0 ; i<10 ; i++) {
a[i] = i+1 ;
}

CreateListR(L,a,10) ;
PrintLink(L) ;
LNode * node = GetElem(L,5,e) ;
cout<<"e : "<<e <<endl;
cout<<"node : "<<node->data <<endl;

ListInsert(L,1,99) ;
PrintLink(L);


return 0 ;
}