单项链表的功能实现

#ifndef _SINGLE_LINK_LIST_H
#define _SINGLE_LINK_LIST_H
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


typedef int EYYPE;

typedef struct Node{
	EYYPE elem;						//元素 
	struct Node*next;				//下一个节点的位置 
}*SLinketList;

#define NODESIZE sizeof(struct Node) 
// 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
#endif

#include"singlelinklist.h"




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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值