首页 > 其他 > 详细

双向链表的操作

时间:2014-03-12 22:59:57      阅读:622      评论:0      收藏:0      [点我收藏+]
//重点实现完成双向链表的操作:

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

 #define debug 0
typedef struct _tag_Name T_name, *PT_name;
struct _tag_Name {
	char* 	name;
	PT_name	pre;
	PT_name	next;
};
static PT_name g_ptName_head;

void del_name(PT_name pt_del)
{
	PT_name  ptCurrent = g_ptName_head;
	PT_name  Pre = NULL;
	PT_name 	Next = NULL;
#if debug
	printf("g_ptName_head  0x%X, pt_del 0x%X\n",g_ptName_head, pt_del);
#endif	
	/*合法性检测*/
	if(g_ptName_head != NULL)
	{
		/*删除第一个*/
		if(g_ptName_head == pt_del)
		{
			g_ptName_head 	= g_ptName_head->next;
		}
		else
		{
			ptCurrent = g_ptName_head->next;
			while(ptCurrent)
			{
				if(ptCurrent == pt_del)
				{
					/*找到要删除的地址*/
					Pre = ptCurrent->pre;
					Next = ptCurrent->next;

					Pre->next = Next;
					if(Next)
					{
						Next->pre = Pre;
					}
				}
				ptCurrent = ptCurrent->next;

			}
		}
		free(pt_del->name);
		free(pt_del);
	}
	else
	{
		return ;
	}
}
PT_name	get_name(char* name)
{
	PT_name ptCurrent;
#if debug
	printf("g_ptName_head  0x%X\n",g_ptName_head);
#endif
	if(g_ptName_head != NULL)
	{
		ptCurrent = g_ptName_head;
		while(ptCurrent)
		{
			if(strcmp(ptCurrent->name, name) == 0)
			{
#if debug
	printf("ptCurrent  0x%X, ptCurrent->name %s\n", ptCurrent, ptCurrent->name);
#endif				
				return ptCurrent;
			}
			ptCurrent = ptCurrent->next;
		}

	}
	else
	{
		return NULL;	
	}
	
	return NULL;
}

void del_one_name()
{
	PT_name	pFindName;
	char name[128];
	printf("please del one name:");
	scanf("%s",	name);
#if debug
	printf("name  %s\n",name);
#endif
	pFindName = get_name(name);
	if(pFindName == NULL)
	{
		printf("no name found\n");
		return ;
	}
	del_name(pFindName);
}
void add_NewNameToLink(PT_name ptNewName)
{
	PT_name	pCurrent;
	pCurrent	= g_ptName_head;
#if debug
	printf("g_ptName_head 0x%x\n",g_ptName_head);
#endif
	if(g_ptName_head == NULL)
	{
		/*当没有名字时候*/
		g_ptName_head = ptNewName;
	}
	else
	{
		while(pCurrent->next)
		{
			pCurrent = pCurrent->next;
		}
		/*在链表结尾加上NewName*/
		pCurrent->next = ptNewName;
		ptNewName->pre	= pCurrent;
	}
}

void add_one_name(void)
{
	PT_name	NewName;
	char* str;
	char name[128];
	printf("please add one name: ");
	scanf("%s",name);
	
	 str = (char* )malloc(strlen(name) + 1);
	 strcpy(str, name);
	 NewName =(PT_name)malloc(sizeof(T_name));
	 NewName->name 	= str;
	 NewName->next 	= NULL;
	 NewName->pre 	= NULL;
#if debug
	printf("str = %s\n", NewName->name);
#endif
	 add_NewNameToLink(NewName);
}

void list_all_names(void)
{
	PT_name	ptCurrent;
	ptCurrent= g_ptName_head;
	int	i = 0;
#if debug
	printf("g_ptName_head = %X,  ptCurrent= %X\n", g_ptName_head, ptCurrent);
#endif
	if(ptCurrent)
	{
		while(ptCurrent)
		{
			printf("%X:	%s\n",	i++,	ptCurrent->name);	
			ptCurrent = ptCurrent->next;
		}
	}
	else
	{
		printf("no name!!!!\n");
	}
}



int main()
{
	char c;
	printf("welcome to LinkList\n");
	while(1)
	{
			printf("<l>:	List all the names\n");
			printf("<a>:	add one name\n");
			printf("<d>:	delete one name\n");
			printf("<q>:	exit\n");
			printf("Enter the choise: ");
			c = getchar();
			switch(c)
			{
			case ‘l‘:
				list_all_names();
				break;
			case ‘a‘:
				add_one_name();
				break;
			case ‘d‘:
				del_one_name();
				break;
			case ‘q‘:
				return 0;
				break;
			default:
				break;
			}
	}
	return 0;
}

双向链表的操作,布布扣,bubuko.com

双向链表的操作

原文:http://blog.csdn.net/dream890527/article/details/21113285

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!