1. 程式人生 > >指標、連結串列操作

指標、連結串列操作

藍線表示刪除ptCur項後

雙向連結串列
藍線表示刪除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; } }