指標、連結串列操作
阿新 • • 發佈:2019-01-12
雙向連結串列
藍線表示刪除ptCur項後
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 add_one_name()
{
PT_Name ptNew;
char *str;
char name[128];
printf("enter the name:");
scanf("%s", name);
str = malloc(strlen(name) + 1);
strcpy(str, name) ;
/*初始化*/
ptNew = malloc(sizeof(T_Name));
ptNew->name = str;
ptNew->pre = NULL;
ptNew->next = NULL;
add_name(ptNew);
}
/*查詢name*/
PT_Name get_name(char *name)
{
PT_Name ptCur;
if (g_ptNameHead == NULL)
{
return NULL;
}
else
{
ptCur = g_ptNameHead;
do { /*name相同則返回,否則繼續查詢*/
if (strcmp(ptCur->name, name) == 0)
return ptCur;
else
ptCur = ptCur->next;
}while (ptCur);
}
return NULL;
}
/* 釋放 */
void del_name(PT_Name ptDel)
{
PT_Name ptCur;
PT_Name ptPre;
PT_Name ptNext;
/*刪除的為第一項*/
if (g_ptNameHead == ptDel)
{
g_ptNameHead = ptDel->next;
return;
}
else
{
ptCur = g_ptNameHead->next;
while (ptCur)
{
if (ptCur == ptDel)
{
/* 取出當前項的前一項和後一項 */
ptPre = ptCur->pre;
ptNext = ptCur->next;
ptPre->next = ptNext;//前一項next指向後一項
if (ptNext)
{
ptNext->pre = ptPre;
}
break;
}
else
{
ptCur = ptCur->next;
}
}
}
/* 釋放 */
free(ptDel->name);
free(ptDel);
}
void del_one_name()
{ /*先查詢再刪除*/
PT_Name ptFind;
char name[128];
printf("enter the name:");
scanf("%s", name);
ptFind = get_name(name);
if (ptFind == NULL)
{
printf("do not have this name\n");
return ;
}
del_name(ptFind);
}
void list_all_name(void)
{
PT_Name ptCur;
int i = 0;
ptCur = g_ptNameHead;
while (ptCur)
{ /*遍歷 */
printf("%02d : %s\n", i++, ptCur->name);
ptCur = ptCur->next;
}
}