リニアテーブルのチェーン式記憶構造——シングルチェーン表、ハンドルコメントコード解説


私は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("
"); }