您的位置:首页 > 编程语言 > C语言/C++

c语言 之 双向链表 简单操作

2015-02-12 14:55 337 查看
==============================版权 所有 vevenlcf 梦想专栏 ==================================

/*
*   双向链表的简单操作
*   author: vevenlcf
*   created: 2015-02-12 14:54 pm
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_NAME_LEN 255

int my_index = 1;

typedef struct LIST
{
	int  id;
	char name[MAX_NAME_LEN];
	struct LIST* next;
	struct LIST* pre;
}LIST;

typedef struct Node
{
	LIST *head;
	LIST *tail;
	int  list_size;
}Node;

typedef struct Name
{
	int id;
	char name[MAX_NAME_LEN];
}Name;

const  Name  name[] =
{
	{1, "小飞"},
	{2, "小名"},
	{3, "小红"},
	{4, "小方"},
	{5, "大飞"}
};

const char * Search_name(int  id)
{
	int i = 0;
	for(i; i<6; i++)
	{
		if(name[i].id == id)
			return  name[i].name;
	}
	return NULL;
}

void LIST_INIT(Node** node)
{
	if(NULL != *node)
		return ;
	
	Node *tmp_node = (Node*)malloc(sizeof(Node)); 
	tmp_node->head = (LIST*)malloc(sizeof(LIST));
	memcpy(tmp_node->head->name, "head", strlen("head"));
	tmp_node->head->id = 0;
	tmp_node->head->next = NULL;
	tmp_node->head->pre  = NULL;
	tmp_node->tail = tmp_node->head;
	tmp_node->list_size= 1 ;
	*node = tmp_node;
	return ;
}

void create_node(LIST** pnode)
{
	LIST* tmp_pnode = (LIST*)malloc(sizeof(LIST));
	const char *sp_name =  Search_name(my_index);

	if( NULL == sp_name)
	{
		memcpy(tmp_pnode->name, "NU::", strlen("NU::"));
	}
	else
	{
		memcpy(tmp_pnode->name, sp_name, strlen(sp_name));
	}

	tmp_pnode->id = my_index;
	*pnode = tmp_pnode;
	my_index ++;
	return ;

}
 // ==============================版权   所有  vevenlcf  梦想专栏 ==================================
void ADD_NODE(Node* plist, LIST* pnode, void create_node(LIST** pnode))
{
	if(NULL == plist)
		return ;

	if(NULL == pnode)
		create_node(&pnode);

	if(NULL != pnode)
	{
		if(plist->head == plist->tail)
		{	
			plist->tail = pnode;
			pnode->pre = plist->head;
			plist->head->next = pnode;
			pnode->next = NULL;
		}	
		else
		{
			LIST* tmp = plist->tail;
			pnode->next = tmp->next;
			pnode->pre = tmp;
			tmp->next = pnode;
			plist->tail = pnode;
		}
		plist->list_size ++;
	}
	
}

//在指定的id处 插入 对应的值

int insert_data(Node* plist, LIST* pnod)
{
	if(NULL == plist || NULL == pnod)
		return 0;
	
	int id = pnod->id;
	LIST *tmp, *swap;
	tmp = plist->tail;
	if(tmp->id < id)
	{
		pnod->next = tmp->next;
		pnod->pre  =  tmp;
		tmp->next  = pnod;
		
		plist->tail = pnod;
		plist->list_size++; 
		
		return 1;
	}
	else
	{
		if((NULL == tmp->pre) && (plist->list_size == 1))
		{
			pnod->next =  tmp;
			pnod->pre  =  tmp->pre;
			tmp->pre   =  pnod;

			plist->head = pnod;
			plist->list_size++; 

			return 1;
		}
		while(tmp->pre != NULL)
		{
			if((tmp->pre->id < id) && (tmp->id > id))
			{
				pnod->pre  = tmp->pre;
				pnod->next = tmp;
				tmp->pre->next = pnod;
				tmp->pre = pnod;
				plist->list_size++;
				return 1;
			}
			tmp = tmp->pre ;
		}
	}
	return 0;
}

// 搜索指定 位置的名字
char*  SEARCH_ID(Node* node, int  id)
{
	if(NULL == node)
		return;
	LIST* tmp = node->head;
	while(tmp)
	{
		if(tmp->id == id)
			return tmp->name;
		else
			tmp =  tmp->next;
	}
	return NULL;
}

//修改 指定位置的值
void  UPDATE_ID(Node* node, int id, char* up_name)
{
	
	if(NULL == node)
		return;
	LIST* tmp = node->head;
	while(tmp)
	{
		if(tmp->id == id)
		{
			memset(tmp->name, 0, sizeof(tmp->name));
			memcpy(tmp->name, up_name, strlen(up_name));	
			tmp->name[strlen(up_name)] ='\0';
		}
		tmp =  tmp->next;
	}
	return ;
}

//删除指定id 处 的 节点
char*  DELETE_ID(Node* node, int id)
{
	if(NULL == node)
		return ;
	LIST* tmp = node->head;
	while(tmp)
	{
		if(tmp->id == id)
		{
			//这边仅仅 做一个中间位置的处理两边的话比较简单
			tmp->pre->next = tmp->next;
			tmp->next->pre = tmp->pre;
			node->list_size--;
		}
		tmp = tmp->next;
	}
		
}

void FREE_LIST(Node* node)
{
	if(NULL == node)
		return ;
	LIST* tmp = node->head;
	while(NULL != tmp)
	{
		tmp = tmp->next;
		free(tmp);
		node->list_size --;
		printf("%2d ", node->list_size);
	}
	printf("\n");
	return ;
}

void TR***EL_LIST(Node* node)
{
	if(NULL == node || NULL == node->head || NULL == node->tail || 0 == node->list_size)
		return ;
	LIST* tmp_node = node->tail;
	while(tmp_node)
	{
		printf("id=%d, name=%s\n", tmp_node->id, tmp_node->name);
		tmp_node = tmp_node->pre;
	}
}

int  main()
{
	Node* node = NULL;

	LIST_INIT(&node);

	TR***EL_LIST(node);

//从尾部添加
	int i =0;
	for(i; i< 6; i++)
	{	
		LIST* tmp = NULL;
		ADD_NODE(node, tmp, create_node);
	}
	TR***EL_LIST(node);
	printf("====================\n");
//将id 插入特定位置
 //   INSERT_NODE(node, id);

	LIST* pnode = (LIST*)malloc(sizeof(LIST));
	pnode->id = 9;
	memcpy(pnode->name, "2222", strlen("2222"));

	insert_data(node, pnode);

	LIST* pnode2 = (LIST*)malloc(sizeof(LIST));
	pnode2->id = 8;
	memcpy(pnode2->name, "2222", strlen("2222"));

	insert_data(node, pnode2);

	LIST* pnode3 = (LIST*)malloc(sizeof(LIST));
	pnode3->id = 7;
	memcpy(pnode3->name, "2222", strlen("2222"));

	insert_data(node, pnode3);

	LIST* pnode4 = (LIST*)malloc(sizeof(LIST));
	pnode4->id = -1;
	memcpy(pnode4->name, "99999", strlen("22222"));

	insert_data(node, pnode4);
	TR***EL_LIST(node);	
	printf("==================\n");
//搜索
	char *sp = SEARCH_ID(node, 2);	
	printf("Search name = %s\n", sp);

//删除
	DELETE_ID(node, 2);
	
	TR***EL_LIST(node);
	printf(":----------------------\n");
//修改值
	UPDATE_ID(node, 7, "小狗");
	UPDATE_ID(node, 8, "小猪");
	UPDATE_ID(node, 9, "小猫");
	TR***EL_LIST(node);
	printf("--------==================\n");
//释放
	FREE_LIST(node);
	TR***EL_LIST(node);

	return 0;
	
}
 // ==============================版权   所有  vevenlcf  梦想专栏 =========================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: