リニアテーブルのチェーン式記憶構造——シングルチェーン表、ハンドルコメントコード解説
私はC言語コードを通じて、シングルチェーンテーブルの初期化、空かどうかの判断、空の線形表、照会、検索、挿入、削除、戻りの長さなどの操作を実現しました.そして、メイン関数テストコンパイルの実行が通ります.
私はコードに対してハンドルの単独の行の注釈を行いました.そしてシングルチェーン表の各操作に適した理解とコードの記憶があります.コードを下記のように共有します.
私はコードに対してハンドルの単独の行の注釈を行いました.そしてシングルチェーン表の各操作に適した理解とコードの記憶があります.コードを下記のように共有します.
#include
#include
#define bool int
#define true 1
#define false 0
#define ok 1
#define error 0
typedef int ElemType;
typedef int Status;
typedef struct Node {//
ElemType data;//
struct Node *next;//
} Node;
typedef struct Node* LinkList;// LinkList:struct Node*
//
void InitList(LinkList* L);
bool ListEmpty(LinkList L);
void ClearList(LinkList* L);
Status GetElem(LinkList L, int i, ElemType *e);
int LocateElem(LinkList L, ElemType e);
Status ListInsert(LinkList *L, int i, ElemType e);
Status ListDelete(LinkList *L, int i, ElemType *e);
int ListLength(LinkList L);
void PrintList(LinkList L);
int main(int argc, char *argv[]) {//
ElemType e;// e
LinkList list;// list
InitList(&list);//
printf(" ? %d
", ListEmpty(list));// ListEmpty , , 1
ListInsert(&list, 1, 1);// ListInsert 3 , 1,2,3; ,
ListInsert(&list, 1, 2);
ListInsert(&list, 1, 3);
PrintList(list);// , 3,2,1
printf(" 2 %d
", LocateElem(list, 2)); // LocateElem 2 ,
printf(" 4 %d
", LocateElem(list, 4)); // LocateElem 4 , , 4, 0
printf(" : %d
", ListLength(list));// ListLength , 3
ListInsert(&list, 1, 4);// ListInsert
ListInsert(&list, 1, 5);
PrintList(list);// 5,4,3,2,1
printf(" 4 %d
", LocateElem(list, 4));// LocateElem 4
printf(" ? %d
", ListEmpty(list));// ListEmpty , 5 , 0
printf(" : %d
", ListLength(list));// 5
ListInsert(&list, 3, 100);// 100
PrintList(list);// 5,4,100,3,2,1
ListDelete(&list, 3, &e);// ListDelete 100
PrintList(list);// 100 , 5,4,3,2,1
printf(" :%d
", e);// e
ClearList(&list);//
printf(" ? %d
", ListEmpty(list));// , 1
printf(" : %d
", ListLength(list));// 0
return 0;
}
void InitList(LinkList* L) {//
*L = (LinkList)malloc(sizeof(Node));//
(*L) -> next = NULL;//
}
bool ListEmpty(LinkList L) {//
return L->next == NULL;// ,
}
void ClearList(LinkList* L) {//
LinkList p,q;//
p = (*L)-> next;//p ,
while (p) {//
q = p->next;//q
free(p);// p
p = q;// q p
}
(*L)->next = NULL;//
}
Status GetElem(LinkList L, int i, ElemType *e) {// L i e
int j;// j
LinkList p;// p
p = L->next;//p ,
j = 1;// 1
while (p && j < i) {// i
p = p->next;//p
++j;//
}
if (!p || j > i) {// ,j > i , i = 0
return error;//
}
*e = p->data;// e
return ok;//
}
int LocateElem(LinkList L, ElemType e) {// L e , , ; , 0 .
int j;// j
LinkList p;// p
p = L->next;//p ,
j = 1;// 1
while (p && p->data != e) {//
p = p->next;//p
++j;//
}
if (!p) {//
return 0;// 0
}
return j;// , j
}
Status ListInsert(LinkList *L, int i, ElemType e) {// L i e
int j;// j
LinkList p, s;// p,s
p = *L;//p , ,
j = 1;// 1
while (p && j < i) {// jnext;//p
++j;// 1
}
if (!p || j > i) {// ,j>i , i=0
return error;//
}
s = (LinkList)malloc(sizeof(Node));// s
s->data = e;//s e,
s->next = p->next;//s p NULL, i
p->next = s;// i p s
return ok; //
}
Status ListDelete(LinkList *L, int i, ElemType *e) {// L i , e
int j;//
LinkList p, q;// p,q
p = *L;//p , ,
j = 1;// 1
while (p->next && j < i) {// , i
p = p->next;//p
++j;// 1
}
if (!(p->next) || j > i) {// ,j>i , i=0
return error;//
}
q = p->next;//q , p
p->next = q->next;// p q q
*e = q->data;// p e
free(q);// q
return ok;//
}
int ListLength(LinkList L) {// L
int j;// j
LinkList p;// P
p = L->next;//p
j = 0;// 0
while (p) {//
p = p->next;//p
++j;// 1
}
return j;// , j
}
void PrintList(LinkList L) {//
int i;// i
ElemType e;//
for (i = 1; i < ListLength(L) + 1; i++) {// 1 , ,
if (GetElem(L, i, &e)) {// i
printf("%d ",e);// e
}
}
printf("
");
}