C++双向链表操作

头文件:link_0505.h
/*
链表演示
*/
#ifndef  __LINK_0505
#define __LINK_0505
typedef struct node{
	int num;
	struct node* p_next;
	struct node *p_pre;
}node;
typedef struct  
{
	node head,tail;
	struct node *p_cur;
}link;
//链表的初始化函数
void link_init(link *);
//链表的清理函数
void link_deinit(link *);
//判断链表是否空的函数
int link_empty(link *);
//判断链表是否满的函数
int link_full(link *);
//统计有效数字个数的函数
int link_size(link *);
//在最前边插入数字的函数
int link_add_head(link *, int );
//在最后边插入新的数字的函数
void  append(link *, int );
//把数字按照顺序插入到链表的函数
int link_insert(link *, int);
//删除最前面数字的函数
int link_remove_head(link *);
//删除最后一个有效数字
int link_remove_tail(link *);
//删除某个给定数字的函数
int link_remove(link *, int );
//获得第一个有效数字的函数
int link_get_head(link *, int *);
//获得最后一个有效数字的函数
int link_get_tail(link *, int *);
//获得指定编号数字的函数
int link_get(link *, int *, int );
//开始从前向后遍历
void link_begin(link *);
//获得最后一个数字
int link_next(link *, int *);
//开始从后向前便利的函数
void link_rbegin(link *);
//获得前一个数字的函数
int link_prev(link *, int *);

#endif
link_0505.cpp
 
  
/*
链表演示
*/
#include "stdlib.h"
#include "link_0505.h"
//链表的初始化函数
void link_init(link *p_link)
{
	p_link->head.p_next = &(p_link->tail);
	p_link->tail.p_next = NULL;
	p_link->tail.p_pre = &(p_link->head);
	p_link->head.p_pre = NULL;
	p_link->p_cur = NULL;
}
//链表的清理函数
void link_deinit(link *p_link)
{
	while(p_link->head.p_next != &(p_link->tail))
	{
		node *p_first = &(p_link->head);
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		p_first->p_next = p_last;
		p_last->p_pre = p_first;
		free(p_mid);
		p_mid = NULL;
	}
	p_link->p_cur = NULL;
}
//判断链表是否空的函数
int link_empty(link *p_link)
{
	return p_link->head.p_next == &(p_link->tail);
}
//判断链表是否满的函数
int link_full(link *p_link)
{
	return 0;
}
//统计有效数字个数的函数
int link_size(link *p_link)
{
	int cnt = 0;
	node *p_node = NULL;
	for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
	{
		node *p_first = p_node;
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		if (p_mid != &(p_link->tail))
		{
			cnt++;
		}
	}
	return cnt;
}
//在最前边插入数字的函数
int link_add_head(link *p_link, int num)
{
	node *p_temp = (node *)malloc(sizeof(node));
	if (!p_temp)
	{
		return 0;
	}	

	p_temp->num = num;
	node *p_first = &(p_link->head);
	node *p_mid = p_first->p_next;
	node *p_last = p_mid->p_next;
	p_first->p_next = p_temp;
	p_temp->p_next = p_mid;
	p_mid->p_pre = p_temp;
	p_temp->p_pre = p_first;
	return 1;
}
//在最后边插入新的数字的函数
int append(link *p_link, int num)
{
	node *p_first = NULL,*p_mid = NULL,*p_last = NULL;
	node *p_tmp = (node *)malloc(sizeof(node));
	if (!p_tmp)
	{
		return 0;
	}
	p_tmp->num = num;
	p_tmp->p_pre = NULL;
	p_tmp->p_next = NULL;
	p_first = p_link->tail.p_pre;
	p_mid = p_first->p_next;
	p_last = p_mid->p_next;
	p_first->p_next = p_tmp;
	p_tmp->p_next = p_mid;
	p_mid->p_pre = p_tmp;
	p_tmp->p_pre = p_first;
	return 1;
}
//把数字按照顺序插入到链表的函数
int link_insert(link *p_link, int num)
{
	node* p_temp = (node *)malloc(sizeof(node));
	node* p_node = NULL;
	if (!p_temp)
	{
		return 0;
	}
	p_temp->num = num;
	p_temp->p_next = NULL;
	for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
	{
		node *p_first = p_node;
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		if (p_mid == &(p_link->tail) || p_mid->num > p_temp->num)
		{
			p_first->p_next = p_temp;
			p_temp->p_next = p_mid;
			p_mid->p_pre = p_temp;
			p_temp->p_pre = p_first;
			break;
		}
	}
	return 0;
}
//删除最前面数字的函数
int link_remove_head(link *p_link)
{
	node *p_first = &(p_link->head);
	node *p_mid = p_first->p_next;
	node *p_last = p_mid->p_next;
	if (p_link->head.p_next == &(p_link->tail))
	{
		return 0;
	}
	p_first->p_next = p_last;
	p_last->p_pre = p_first;
	free(p_mid);
	p_mid = NULL;
	return 0;
}
//删除最后一个有效数字
int link_remove_tail(link *p_link)
{
	node *p_first = NULL,*p_mid = NULL,*p_last = NULL;
	if (p_link->head.p_next == &(p_link->tail))
	{
		return 0;
	}
	p_last = &(p_link->tail);
	p_mid = p_last->p_pre;
	p_first = p_mid->p_pre;

	p_first->p_next = p_last;
	 p_last->p_pre = p_first;
	 free(p_mid);
	 p_mid = NULL;
	 return 0;
}
//删除某个给定数字的函数
int link_remove(link *p_link, int num)
{
	node *p_node = NULL;
	for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
	{
		node *p_first = p_node;
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		if (p_mid != &(p_link->tail) && p_mid->num == num)
		{
			p_first->p_next = p_last;
			p_last->p_pre = p_first;
			free(p_mid);
			p_mid = NULL;
			return 1;
		}
	}
	return 0;
}
//获得第一个有效数字的函数
int link_get_head(link *p_link, int *p_num)
{
	if (p_link->head.p_next == &(p_link->tail))
	{
		return 0;
	}
	node *p_first = &(p_link->head);
	node *p_mid = p_first->p_next;
	node *p_last = p_mid->p_next;
	p_first->p_next = p_last;
	*p_num = p_mid->num;
	return 1;
}
//获得最后一个有效数字的函数
int link_get_tail(link *p_link, int *p_num)
{
	node *p_node = NULL;
	for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
	{
		node *p_first = p_node;
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		if (p_last == &(p_link->tail))
		{
			*p_num = p_mid->num;
			return 1;
		}
	}
	return 0;
}
//获得指定编号数字的函数
int link_get(link *p_link, int *p_num, int num)
{
	int cnt = 0;
	node *p_node = NULL;
	for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
	{
		node *p_first = p_node;
		node *p_mid = p_first->p_next;
		node *p_last = p_mid->p_next;
		if (p_mid != &(p_link->tail) && cnt == num)
		{
			*p_num = p_mid->num;
			return 1;
		}
		cnt++;
	}
	return 0;
}
//开始从前向后遍历
void link_begin(link *p_link)
{
	p_link->p_cur = &(p_link->head);
}
//获得最后一个数字
int link_next(link *p_link, int *p_num)
{
	if (!p_link->p_cur)
	{
		return 0;
	}
	p_link->p_cur = p_link->p_cur->p_next;
	if (p_link->p_cur == &(p_link->tail))
	{
		p_link->p_cur = NULL;
		return 0;
	}
	else{
		*p_num = p_link->p_cur->num;
		return 1;
	}
}
//开始从后向前便利的函数
void link_rbegin(link *p_link)
{
	p_link->p_cur = &(p_link->tail);
}
//获得前一个数字的函数
int link_prev(link *p_link, int *p_num)
{
	if (!p_link->p_cur)
	{
		return 0;
	}
	p_link->p_cur = p_link->p_cur->p_pre;
	if (p_link->p_cur == &(p_link->head))
	{
		p_link->p_cur = NULL;
		return 0;
	}
	else{
		*p_num = p_link->p_cur->num;
		return 1;
	}
}

main.cpp
/*
 * 链表测试
 * */
#include <stdio.h>
#include "link_0505.h"
int main() {
	int num;
	link lnk = {0};
	link_init(&lnk);
	append(&lnk,4);
	append(&lnk,9);
	append(&lnk,14);
	append(&lnk,21);
	append(&lnk,35);
	link_add_head(&lnk,2);
	link_insert(&lnk,17);
	link_begin(&lnk);
	while(link_next(&lnk,&num))
	{
		printf("%d ",num);
	}
	printf("\n");
	link_remove_head(&lnk);
	link_remove_tail(&lnk);
	link_remove(&lnk,9);
	link_rbegin(&lnk);
	while(link_prev(&lnk,&num))
	{
		printf("%d ", num);
	}
	printf("\n");
	printf("有效数字个数是%d\n",link_size(&lnk));
	link_deinit(&lnk);
    return 0;
}








猜你喜欢

转载自blog.csdn.net/chulijun3107/article/details/80213508
今日推荐