数据结构——单链表

        现在浅展示一下单链表。单链表是一种常见的数据结构,它通过指针将数据元素连接在一起,形成一个线性序列。每个元素(通常称为节点)包含一个数据域和一个指针域,数据域存储实际的数据,指针域指向链表中的下一个节点。单链表的结构包含头尾指针以及结点数量,下面我们一起来看一下单链表的构造。

#define TYPE int

typedef struct Node
{
	TYPE data;
	struct Node *next;
}Node;
typedef struct List
{
	Node *head;
	Node *tail;
	int cnt;
}List;

下面开始一些单链表的具体操作:(操作有点多,耐心看一下吧)

创建结点

//创建结点
Node *create_node(TYPE data)
{
	Node *node=malloc(sizeof(Node));
	node->data=data;
	node->next=NULL;
	return node;
}

创建链表

//创建链表
List *create_list(void)
{
	List *list=malloc(sizeof(List));
	list->head=create_node(0);//空的头结点
	list->tail=NULL;
	list->cnt=0;
	return list;
}

头添加

//头添加
bool add_head(List *list,TYPE data)
{
	Node *node=create_node(data);
	if(0==list->cnt)
	{
		list->head->next=node;
		list->tail=node;
		return true;
	}
	node->next=list->head->next;
	list->head->next=node;
	list->cnt++;
	return true;
}

尾添加

//尾添加
bool add_tail(List *list,TYPE data)
{
	Node *node=create_node(data);
	if(0==list->cnt)
	{
		list->head->next=node;
		list->tail=node;
		return true;
	}
	list->tail->next=node;
	list->tail=node;
	list->cnt++;
}

头删除

//头删除
bool del_head(List *list)
{
	if(0==list->cnt) return false;
	Node *temp=list->head->next;
	list->head->next=temp->next;
	if(1==list->cnt) list->tail=NULL;
	free(temp);
	temp=NULL;
	list->cnt--;
	return true;
}

尾删除

//尾删除
bool del_tail(List *list)
{
	if(0==list->cnt) return false;
	free(list->tail);
	if(1==list->cnt) 
	{
		list->head->next=NULL;
		list->tail=NULL;
		return true;
	}
	Node *prev=list->head->next;
	while(prev->next!=list->tail) prev=prev->next;
	prev->next=NULL;
	list->tail=prev;
	list->cnt--;
	return true;
}

插入

//插入
bool insert_list(List *list,int index,TYPE data)
{
	if(1==list->cnt) add_head(list);
	while(--index>0)
	{
		list->head=list->head->next;
		if(NULL=list->head->next) return false;
	}
	Node *node=create_node(data);
	node->next=list->head->next;
	list->head->next=node;
	list->cnt++;
	return true;
}

按值删除

//按值删除
bool del_value(List *list,TYPE val)
{
	if(0==list->cnt) return false;
	if(val==list->tail->data) del_tail(list);
	if(val==lsit->head->next->data) del_head(list);
	for(Node *n=list->head->next;n->next;n=n->next)
	{
		if(val==n->next->data)
		{
			Node *temp=n->next;
			n->next=temp->next;
			list->cnt--;
			free(temp);
			temp=NULL;
			return true;
		}
	}
	return false;
}

按位置删除

//按位置删除
bool del_index(List *list,int index)
{
	while(--index>0)
	{
		list->head=list->head->next;
		if(NULL==list->head->next) return false;
	}
	Node *temp=list->head->next;
	list->head->next=temp->next;
	list->cnt--;
	free(temp);
	temp=NULL;
	return true;
}

按位置修改

//按位置修改
bool del_index(List *list,int index,TYPE data)
{
	while(--index>0)
	{
		list->head=list->head->next;
		if(NULL==list->head->next) return false;
	}
	list->head->next=data;
	return true;
}

按值修改

//按值修改
bool modify_list(List *list,TYPE old,TYPE new)
{
	if(0==list->cnt) return false;
	int num=0;
	for(Node *n=list->head->next;n->next;n=n->next;)
	{
		if(old==n->next->data)
		{
			n->next->data=new;
			num++;
		}
	}
	if(!num) return false;
	return true;
}

查询

//查询
int query_list(List *list,TYPE key)
{
	int index=0;
	if(0==list->cnt) return -1;
	for(Node *n=list->head->next;n;n=n->next,index++)
	{
		if(key==n->data) return index;
	}
	return -1;
}

排序

//排序
void sort_list(List *list)
{
	for(Node *i=list->head->next;i->next;i=i->next)
	{
		for(Node *j=i->next;j;j=j->next)
		{
			if(j->data>i->data)
			{
				TYPE temp=i->data;
				i->data=j->data;
				j->data=temp;
			}
		}
	}
}

访问

//访问
bool access_list(List *list,int index,TYPE *val)
{
	if(0==list->cnt) return false;
	while(--index>0)
	{
		list->head=list->head->next;
		if(NULL=list->head->next) return false;
	}
	*val=list->head->next;
	return true;
}

清空

//清空
void clean_list(List *list)
{
	Node *n=list->head->next;
	while(n)
	{
		Node *temp=n;
		n=temp->next;
		free(temp);
	}
	list->head->next=NULL;
	list->tail=NULL;
	list->cnt=0;
}

销毁

//销毁
void destroy_list(List *list)
{
	clean_list(list);
	free(list->head);
	free(list->tail);
	free(list);
}

遍历

//遍历
void show_list(List *list)
{
	if(0==list->cnt) printf("空链表!\n");
	for(Node *n=list->head->next;n;n=n->next)
	{
		printf("%d ",n->data);	
	}
	printf("\n");
}

单链表差不多大概就是上面这些操作,至于测试此处省略一万行代码……

over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值