單鏈表的定義:
typedef struct Node { int data; struct Node* next; }Node,*LinkList;
單鏈表的初始化(帶頭節(jié)點):
bool InitList(LinkList* L) { *L = (LinkList)malloc(sizeof(Node)); if (*L == NULL) return false; (*L)->next = NULL; return true; }
判斷單鏈表是否為空(帶頭節(jié)點):
bool Empty(LinkList L) { if (L->next == NULL) return true; else { return false; } }
單鏈表的整表創(chuàng)建(帶頭節(jié)點):
bool ListStart(LinkList* L, int n) { Node* p; int i; srand(time(0)); //初始化隨機(jī)種子 *L = (Node*)malloc(sizeof(Node)); (*L)->next = NULL; //先建立一個帶頭結(jié)點的單鏈表 for (i = 0; i < n; i++) { p = (Node*)malloc(sizeof(Node)); //生成新結(jié)點 if (p == NULL) return false; //判斷獲取內(nèi)存是否成功 p->data = rand() % 100 + 1; //隨機(jī)生成100以內(nèi)的數(shù)字 p->next = (*L)->next; (*L)->next = p; //采用頭插法,插入到表頭 } return true; }
顯示整個單鏈表:
void ListShow(LinkList L) { printf("\n"); Node* p; //創(chuàng)建新結(jié)點,作為額外指針 p = L->next; //p越過頭結(jié)點,指向第一個結(jié)點 while (p != NULL) { printf("%d-", p->data); //輸出結(jié)點的值 p = p->next; //p指向下一個結(jié)點 } }
單鏈表插入(帶頭結(jié)點,頭插法):
bool ListInsert(LinkList* L, int i, int* e)
{
if (i < 1)
return false; //插入位置不合法
Node * p, *s;
p = *L; //p作為額外指針
int j = 0; //j指示p的位置
while (p && j < i-1) //尋找i-1個結(jié)點
{
p = p->next;
j++;
}
if (p == NULL)
return false; //i不合法
s = (Node*)malloc(sizeof(Node));
s->data = *e;
s->next = p->next;
p->next = s;
return true;
}
單鏈表插入(帶頭結(jié)點,尾插法):
bool ListAdd(LinkList* L, int i, int* e) { if (i < 1) return false; Node* p; p = *L; int j = 0; while (p && j < i) //尋找第i個結(jié)點 { p = p->next; j++; } if (p == NULL) return false; Node* s; s = (Node*)malloc(sizeof(Node)); s->data = *e; s->next = p->next; p->next = s; //將s插入到第i個后面 return true; }
單鏈表刪除(帶頭結(jié)點):
bool ListDelete(LinkList* L, int i, int* e) { if (i < 1) return false; int j = 0; Node* p; p = *L; while (p && j < i - 1) //尋找第i-1個結(jié)點 { p = p->next; j++; } if (p == NULL) //刪除位置不合法,結(jié)點i-1超出鏈表 return false; if (p->next == NULL) //刪除位置不合法,結(jié)點i超出鏈表 return false; Node* q = p->next; p->next = q->next; *e = q->data; free(q); return true; }
按位查找(帶頭結(jié)點):
bool GetElem(LinkList L,int i, int* e) { if (i < 1) return false; int j = 0; Node* p; p = L; while (p && j < i) { p = p->next; j++; } if (p == NULL) return false; *e = p->data; return true; }
按值查找(帶頭結(jié)點):
bool LocateElem(LinkList L, int e, int *i) { if (Empty(L)) return false; int j = 0; Node* p; p = L; while (p != NULL) { if (p->data == e) { *i = j; return true; } p = p->next; j++; } }
測試代碼(main):
void main(void) { printf("begin\n"); LinkList L; int e,e1 = 16; ListStart(&L, 11); ListShow(L); GetElem(L, 6, &e); printf("n6=%d\n", e); ListInsert(&L, 3, &e1); ListShow(L); LocateElem(L, 16, &e); printf("值16-i=%d\n", e); ListShow(L); }
測試結(jié)果:

浙公網(wǎng)安備 33010602011771號