數碼相框_電子書之指標和連結串列(8)
阿新 • • 發佈:2018-12-15
數碼相框_電子書之指標和連結串列(8)
一級指標
int *p //表示定義一個int型(4位元組)的指標p
&p //表示p自身的地址位置
p //表示p指向的地址位置(也就是p變數的值)
*p //表示p指向的地址裡面的內容
所以 * 的作用:p變數的值作為地址,去訪問這個地址的內容
二級指標
int **pp
&pp //表示pp自身的地址位置
pp //表示pp指向的地址,比如pp=&p,注意pp是int *x型,所以指向其他型別地址將會報錯
*pp //表示pp指向的地址上的內容,比如pp=&p,則*pp將去訪問&p地址的內容
**pp //表示將pp指向的地址上的內容作為地址,去訪問這個地址的內容
電子書存在的連結串列:
比如encodind_managet.c:(ascii、utf8.....)
比如draw.c(上一頁與上一次)
雙向連結串列例項如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct NAME{ char *name; struct NAME *pre;//上個name連結串列成員 struct NAME *next;//下個name連結串列成員 }T_Name, *PT_Name; static PT_Name g_ptNameHead;//連結串列頭 void add_name(PT_Name ptNew) { PT_Name ptCur;//當前的Cur 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 ptCur;//當前的Cur 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; if (ptNext) { ptNext->pre = ptPre; } break; } else { ptCur = ptCur->next; } } } 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); 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) { PT_Name ptCur; if (g_ptNameHead == NULL) { return NULL; } else { ptCur = g_ptNameHead; do { if (strcmp(ptCur->name, name) == 0) return ptCur; else ptCur = ptCur->next; }while (ptCur); } return NULL; } 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; } } 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(); break; } case 'a': { add_one_name(); break; } case 'd': { del_one_name(); break; } case 'x': { return 0; break; } default: { break; } } } return 0; }