typedef int EYYPE;
typedef struct Node{
EYYPE elem; //元素
struct Node*next; //下一个节点的位置
}*SLinketList;
// typedef struct Node *SLinketList;
// 单项链表 有一个头节点 头节点不保留元素 只是作为标识
//头节点不保留数据是为了删除和插入
//创建一个单向链表 只malloc一个头节点
SLinketList slinket_list_creat(void);
//判断单向链表是否为空
bool slinket_list_is_empty(SLinketList head);
//单向链表中的元素个数
size_t slinket_list_size(SLinketList head);
//在指定位置pos插入一个元素elem
int slinket_list_insert(SLinketList head,size_t pos,EYYPE elem);
//在单项链表前插入一个元素elem
int slinket_list_insert_front(SLinketList head,EYYPE elem);
//在单向链表末尾插入一个元素elem
int slinket_list_insert_back(SLinketList head,EYYPE elem);
//删除指定位置pos的元素
int slinket_list_delete(SLinketList head,size_t pos,EYYPE *palem);
//删除单向链表第一个元素
int slinket_list_delete_front(SLinketList head,EYYPE *palem);
//删除末尾的元素
int slinket_list_delete_back(SLinketList head,EYYPE *palem);
//获取指定位置的元素
int slinket_list_get(SLinketList head,size_t pos,EYYPE *palem);
//获取第一个元素
int slinket_list_get_front(SLinketList head,EYYPE *palem);
//获取最后一个元素
int slinket_list_get_back(SLinketList head,EYYPE *palem);
//根据值key来查找 返回-1表示没有该值 否则返回位置
int slinket_list_find(SLinketList head,EYYPE *elem);
//删除所有元素
void slinket_list_clear(SLinketList head);
//销毁链表
void slinket_list_destroy(SLinketList head);
//遍历
void slinket_list_travel(SLinketList head,void(*travel)(int));
//元素逆序
void slinket_list_reverse(SLinketList head);
//获取倒数第pos个元素
//void slinket_list_reverse_by_count
SLinketList slinket_list_creat(void){
struct Node*head=malloc(NODESIZE);
if(head==NULL){
return NULL;
}
head->next=NULL;
return head;
}
bool slinket_list_is_empty(SLinketList head){
return head->next==NULL;
}
size_t slinket_list_size(SLinketList head){
size_t size=0;
struct Node*node=head->next;
while(node!=NULL){
size++;
node=node->next;
}
}
static struct Node*slinket_list_get_prew_node(SLinketList head,size_t pos){//h
struct Node*node=head;
size_t i;
for(i=0;i<pos&&node!=NULL;i++){
node=node->next;
}
return node;
}
void slinket_list_travel(SLinketList head,void(*travel)(int)){
struct Node *node = head->next;
while(node!=NULL){
travel(node->elem);
node = node->next;
}
}
int slinket_list_insert(SLinketList head,size_t pos,EYYPE elem){
//获取pos的指针
struct Node*prew=slinket_list_get_prew_node(head,pos);
if(prew==NULL){
return -1;
}
struct Node*node=(struct Node*)malloc(NODESIZE);
if(node==NULL){
return -2;
}
node->elem=elem;
node->next=prew->next;
prew->next=node;
return 0;
}
int slinket_list_insert_front(SLinketList head,EYYPE elem){
if(head->next==NULL){
return -1;
}
struct Node*first=(struct Node*)malloc(NODESIZE);
if(first==NULL){
return -2;
}
first->elem=elem;
first->next=head->next;
head->next=first;
return 0;
}
int slinket_list_insert_back(SLinketList head,EYYPE elem){
if(head->next==NULL){
return -1;
}
struct Node*last=(struct Node*)malloc(NODESIZE);
struct Node*pre=head->next;
while(pre->next!=NULL){
pre=last->next;
}
last->elem=elem;
pre->next=last;
last->next=NULL;
return 0;
}
int slinket_list_delete(SLinketList head,size_t pos,EYYPE *palem){
struct Node *prew = slinket_list_get_prew_node(head,pos);
if(prew == NULL || prew->next == NULL){
return -1;
}
struct Node *curr = prew->next;
prew->next = curr->next;
*palem = curr->elem;
free(curr);
return 0;
}
int slinket_list_delete_front(SLinketList head,EYYPE *palem){
if(head->next==NULL){
return -1;
}
struct Node*first=head->next;
head->next=first->next;
free(first);
return 0;
}
int slinket_list_delete_back(SLinketList head,EYYPE *palem){
if(head->next==NULL){
return -1;
}
struct Node*lastSec=head;
while(lastSec->next->next!=NULL){
lastSec=lastSec->next;
}
free(lastSec->next);
lastSec->next=NULL;
}
int slinket_list_get(SLinketList head,size_t pos,EYYPE *palem){
struct Node*node=slinket_list_get_prew_node(head,pos+1);
if(node==NULL){
return -1;
}
*palem=node->elem;
return 0;
}
int slinket_list_get_front(SLinketList head,EYYPE *palem){
if(head->next==NULL){
return -1;
}
*palem=head->next->elem;
return 0;
}
int slinket_list_get_back(SLinketList head,EYYPE *palem){
if(head->next==NULL){
return -1;
}
struct Node*last=head->next;
while(last->next!=NULL){
last=last->next;
}
*palem=last->next->elem;
return 0;
}
int slinket_list_find(SLinketList head,EYYPE *palem){
struct Node*node=head->next;
size_t i;
for(i=0;node!=NULL;node=node->next,i++){
if(node->elem==*palem){
return -1;
}
}
return -2;
}
void slinket_list_clear(SLinketList head){
struct Node*node,*next;
for(node=head->next;node!=NULL;node=next){
next=node->next;
free(node);
}
head->next=NULL;
}
void slinket_list_destroy(SLinketList head){
slinket_list_clear(head);
free(head);
}
void slinket_list_reverse(SLinketList head){
if(head->next==NULL||head->next->next==NULL){
return -1;
}
struct Node*prew=NULL;
struct Node*curr=head->next;
struct Node*next=NULL;
while(curr!=NULL){
next=curr->next;
curr->next=prew;
prew=curr;
curr=next;
}
head->next=prew;
}
int slinket_list_get_last(SLinketList head,size_t pos,EYYPE*palem){
struct Node*front=head->next;
struct Node*back=head->next;
size_t i;
for(i=1;front!=NULL&&i<pos;i++){
front=front->next;
}
if(front==NULL){
return -1;
}
while(front->next!=NULL){
front=front->next;
back=back->next;
}
*palem=back->next;
return 0;
}