//重点实现完成双向链表的操作:
#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;
}原文:http://blog.csdn.net/dream890527/article/details/21113285