双向链表操作


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

typedef struct NAME 
{
	char *name;
	struct NAME *pre;
	struct NAME *nxt;

}T_Name,*PT_Name;

PT_Name ptNameHead;

int ListAllName()
{
	PT_Name ptTemp;
	int i=0;
	if(!ptNameHead)
		{
		printf("have no name\n");
		return -1;
		}
	else
		{
		ptTemp=ptNameHead;
		while(ptTemp)
			{
			printf("%06d ,%s\n",i++,ptTemp->name);
			ptTemp=ptTemp->nxt;
			}
		}
	return 0;
}

void AddName(PT_Name ptNew)
{
	PT_Name ptCur;

	if(!ptNameHead)
		{
		ptNameHead = ptNew;
		}
	else
	{//有数据
		ptCur=ptNameHead;
		while(ptCur->nxt)
		{
			ptCur=ptCur->nxt;
		}
		ptCur->nxt    = ptNew;
		ptNew->pre = ptCur;
	}
}

void  AddOneName()
{
	PT_Name ptNew;
	char name[128];
	char *str;
	printf("please input one name\n");
	scanf("%s",name);

	str=malloc(strlen(name)+1);//要多分配一个字节的空间来存放字符串结尾标记'\0'字符
	strcpy(str,name);
/* name是一个局部变量,用来存放名字,
当这个函数结束的时候,该内存就得释放,
所以我们得单独分配一块内来存放这个name ,
下面还得用malloc来分配一个结构体大的内存空间,
记住我们定义结构体的时候不能添加static,
因为定义结构提示不会分配内存空间的,
他定义的只是这种类型,所以我们增加的时候
一定要记得分配内存*/	
	ptNew= malloc(sizeof(T_Name));
	
	ptNew->name=str;
	ptNew->pre=NULL;
	ptNew->nxt=NULL;	

	AddName(ptNew);
	
}

PT_Name FindName(char *name)
{
	PT_Name ptCur;

	if(!ptNameHead)
	{
		printf("have no name,can't delete it \n");
		return 0;
	}
	else
	{
		ptCur=ptNameHead;
		while(ptCur)
		{
			if(strcmp(ptCur->name,name)==0)
				return ptCur;
			else
				ptCur=ptCur->nxt;
		}
	}
	return 0;
}

int  DelName(PT_Name ptDel)
{
	PT_Name ptCur,ptPre,ptNxt;

	if(ptNameHead==ptDel)
	{
		ptNameHead= ptDel->nxt;
		
	}
	else
	{
		ptCur=ptNameHead->nxt;
		while(ptCur)
		{
			if(ptCur == ptDel)
			{
				ptPre=ptCur->pre;
				ptNxt=ptCur->nxt;

				ptPre->nxt=ptNxt;
				if(ptNxt)
				{
					ptNxt->pre=ptPre;
				}

				free(ptDel->name);
				free(ptDel);
				return 0;
			}
			else
				ptCur=ptCur->nxt;
		}
	}	
	return -1;
}

void DelOneName()
{
	PT_Name ptDel;
	char name[128];
	printf("please input the name you want to delete\n");
	scanf("%s",name);

	ptDel=FindName(name);
	if(!ptDel)
	{
		printf("can not find the name\n");
		return -1;
	}
	DelName(ptDel);
}

int main(int argc,char **argv)
{
	char c;
	while(1)
	{
		printf("<l> list all the name\n");
		printf("<a> add one name\n");
		printf("<d> delete one name\n");
		printf("<q> quit\n");

		c=getchar();

		switch(c)
		{
		case 'l':
				{
			ListAllName();
			break;
			}
		case 'a':
		{
			AddOneName();
			break;
		}
		case 'd':
				{
			DelOneName();
			break;
			}
		case 'q':
			{
			return 0;
			break;
			}
		default:
			break;
		}
	}

	return 0;
}



posted @ 2017-03-11 10:56  隔壁王叔叔a  阅读(142)  评论(0)    收藏  举报