这是前面我讲得算法与数据结构中链表的综合,如果这里不明白请看前面的基础知识:链接地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 定义一个结构体 */
typedef struct name{
char *name;
struct name *pre;
struct name *next;
}t_name, *pt_name;
static pt_name g_ptnamehead; /* 定义链表头 */
void add_name(pt_name ptnew)
{
pt_name ptcur;
if (g_ptnamehead == null)
g_ptnamehead = ptnew;
}
else
ptcur = g_ptnamehead;
while (ptcur->next)
ptcur = ptcur->next;
ptcur->next = ptnew;
ptnew->pre = ptcur;
void del_name(pt_name ptdel)
pt_name ptpre;
pt_name ptnext;
if (g_ptnamehead == ptdel) /* 如果链表头等于当前删除的链表 */
g_ptnamehead = ptdel->next;
/* 释放 */
return;
ptcur = g_ptnamehead->next;
while (ptcur)
if (ptcur == ptdel)
/* 从链表中删除 */
ptpre = ptcur->pre;
ptnext = ptcur->next;
ptpre->next = ptnext;
if (ptnext)
ptnext->pre = ptpre;
break;
free(ptdel->name);
free(ptdel);
void add_one_name()
pt_name ptnew;
char *str;
char name[128];
printf("enter the name:");
scanf("%s", name);
str = malloc(strlen(name) + 1);
/* name是一个局部变量,用来存放名字,当这个函数结束的时候,该内存就得释放,所以我们得单独分配一块内来存放这个name ,下面还得用malloc来分配一个结构体大的内存空间,记住我们定义结构体的时候不能添加static,因为定义结构提示不会分配内存空间的,他定义的只是这种类型,所以我们增加的时候一定要记得分配内存*/
strcpy(str, name);
ptnew = malloc(sizeof(t_name));
ptnew->name = str;
ptnew->pre = null;
ptnew->next = null;
add_name(ptnew);
pt_name get_name(char *name)
return null;
do {
if (strcmp(ptcur->name, name) == 0)
return ptcur;
}while (ptcur);
return nul;
void del_one_name()
pt_name ptfind;
ptfind = get_name(name);
if (ptfind == null)
printf("do not have this name\n");
return ;
del_name(ptfind);
void list_all_name(void)
int i = 0;
printf("%02d : %s\n", i++, ptcur->name);
int main(int argc, char **argv)
char c;
while (1)
printf("<l> list all the names\n");
printf("<a> add one name\n");
printf("<d> del one name\n");
printf("<x> exit\n");
printf("enter the choise: ");
c = getchar();
switch (c)
case 'l':
list_all_name();
case 'a':
add_one_name();
case 'd':
del_one_name();
case 'x':
return 0;
default: