//重点实现完成双向链表的操作: #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