带头结点的单链表实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MALLOC_OK 1
#define MALLOC_NO 0
#define CREATE_OK 1
#define CREATE_NO 0

/*
 * 带头结点的单链表
 *
 * */

struct node
{
	int num;
	char name;
	int age;

	struct node *next;
};

typedef struct node Hnode;
typedef Hnode * Hlink;

//判断内存是否分配成功
int is_mallo_ok(Hlink new_node)
{
	if(new_node == NULL)
	{
		return MALLOC_NO;
	}

	return MALLOC_OK;
}

//创建新节点
int create_new_node(Hlink *new_node)
{
	*new_node = (Hlink)malloc(sizeof(Hnode));

	//判断内存是否为空
	if(MALLOC_OK == is_malloc_ok(*new_node))
	{
		return CREATE_OK;
	}

	return CREATE_NO;
}

//创建链表
int create_Hlink(Hlink *head)
{
	if(CREATE_OK == create_new_node(head))
	{
		(*head) -> next = NULL;
		return CREATE_OK;
	}

	return CREATE_NO;
}

//插入链表-头插法
void insert_node_head(Hlink head,Hlink new_node)
{
	new_node -> next = head -> next;
	head -> next = new_node;
}

//中间插入法
void insert_node_mid(Hlink head,Hlink new_node,int loc,int num) //这里的num可以放在主函数直接输入
{
	Hlink p = NULL;
	int count = 1; //计数

	p = head -> next;
	
	if(p == NULL)
	{
		head -> next = new_node;
		new_node ->next = NULL;

	}
	else
	{
		while(p != NULL && count != loc)
		{
			p = p ->next;
			count++;
		}

		if(p != NULL)
		{
			new_node ->num = num;
			new_node ->next = p ->next;
			p ->next = new_node;
		}
		else
		{
			printf("error local to insert!");
		}
	}
}


//尾插法
void insert_node_tail(Hlink head, Hlink new_node)
{
	Hlink p = NULL;

	P = head;

	while(p ->next != NULL)
	{
		p = p ->next;
	}

	p ->next = new_node;
	new_node ->next = NULL;

}

//列出链表
void display_Hlink(Hlink head)
{
	Hlink p = NULL;

	if(head == NULL)
	{
		printf("no this link\n");
	}
	else if(head ->next == NULL)
	{
		printf("link is null\n");
	}
	else
	{
		p = head ->next;

		while(P != NULL)
		{
			printf("%d\n",p ->num);
			p = p ->next;
		}
	}
}

//释放空间-头节点留着
void clear_Hlink(Hlink head)
{
	Hlink p = NULL;

	p = head ->next;

	while(p != NULL)
	{
		head ->next = p ->next;
		free(p);
		p = head ->next;
	}
}


//全部释放
void release_Hlink(Hlink *head)
{
	clear_Hlink(*head);
	free(*head);
	*head = NULL;

	printf("空间全部释放!\n");
}

//查找节点
void seek_node(Hlink head,int n)
{
	Hlink p = NULL;
	int count = 1;

	p = head ->next;

	while(p != NULL && count != n)
	{
		p = p ->next;
		count++;
	}

	if(p != NULL)
	{
		printf("no this node!\n");
	}
}

//删除节点
void delete_node(Hlink head, int delete_node_loc)
{
	Hlink p = NULL;
	Hlink q = NULL;

	q = head;
	p = head;
	int count  = 0;
	int sum = 0;

	while(p != NULL)
	{
		p = p ->next;
		sum++;
	}

	p = head;

	if(p == NULL)
	{
		printf("Link is empty");

	}
	else if(delete_node_loc > sum)
	{
		printf("no this node!");
	}
	else
	{
		p = head;
		while(p != NULL && count != delete_node_loc)
		{
			q = p;
			p = p ->next;
			count++;
		}

		if(p != NULL)
		{
			q ->next = p ->next;
			free(p);
		}
		else
		{
			printf("no this node!");
		}
	}
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值