Cデータ構造における単一チェーンテーブルの基本操作

5520 ワード

Cのtypedef
Cのtypedefキーワードの役割は、データ型の新しい名前を定義することです.この目的は2つあります.1つは、変数に覚えやすく、意味が明確な新しい名前を定義することです.例えば、次のようにします.
typedef unsigned char BYTE;
unsigned charタイプをBYTEと自己命名します.もう1つの目的は、struct構造タイプなどの複雑なタイプ宣言を簡略化することです.
     typedef struct student       {           int age;           int class;       }stu;       stu stu_1;//これで従来の方法より1つのstructを少なく書くことができ、比較的手間が省け、特に大量に使用する場合struct student stu_1;//以上はこの定義に等しく,Cではstructオブジェクトを宣言する際にstructキーを付ける必要があると規定している.
 
typedefを使用して構造体ポインタを定義するには
次のように定義します.
typedef struct TreeNode {     int Element;     struct TreeNode* LeftChild;     struct TreeNode* RightChild; } Node,*PtrToTreeNode;
次のように等価です.
構造体TreeNodeにNodeという別名を付ける.
構造体ポインタTreeNode*にPtrToTreeNodeという別名を付けます.つまりPtrToTreeNodeは実際にはポインタです!
シングルチェーンテーブルの基本操作
チェーンテーブルは、データを線形に格納する構造である(線形構造はデータの論理構造であり、他にもツリー構造、グラフ構造、集合構造がある).チェーンテーブルの格納内容は論理的に連続しているが、物理的に必ずしも連続しているとは限らない.一方向チェーンテーブルの構成は、
  • ヘッダ(head):ポインタドメインのみ、データドメインなし;
  • ノード(node):データドメイン+ポインタドメイン、
  • 表末尾:データドメインのみ、ポインタドメイン(ポインタがNULL)なし、
  • 単一チェーンテーブルノード(node)の定義:
    struct node{     int num;     struct node* Pnext; }
    C言語におけるチェーンテーブルの実現は主に構造体とポインタに依存する.
    単一チェーンテーブルの作成、印刷、長さの計算、指定されたノードの削除、ヘッダーの挿入、チェーンテーブルの増分ソート、逆順序、チェーンテーブルのクリアなどの操作を実現します.
    #include
    #include
    #include
    
    //         
    typedef struct Node{
        int data;
        struct Node* next;
    }node;
    
    //         ,    
    node* createList(const int length){
        node *head,*helper;
        helper = head = (node *)malloc(sizeof(node));
        for(int i=0;inext = (node *)malloc(sizeof(node));
            helper->data = i;
        }    
        helper->next = NULL;
        return head;
    }
    
    //    
    void printList(const node* list1){
        const node* p=NULL;
        p = list1->next;   //                  
        while(p){
            printf("%d
    ",p->data); p = p->next; } } // int length_list(const node* list1){ int n=0; if(list1->next==NULL){ return n; } while(list1->next!=NULL){ n+=1; list1=list1->next; } return n; } // key node* delete_key(node* list1, int key){ if(list1->next==NULL){ return list1; // } node* p, *del; for(p=list1;p->next!=NULL&&p->next->data!=key;p=p->next); if(p->next==NULL){ return list1; // key, list1 } del = p->next; p->next=p->next->next; free(del); del = NULL; return list1; } // key node* insert_list(node* list1, int key, int head_or_end){ node* insert_key = (node*)malloc(sizeof(node)); insert_key->data = key; if(head_or_end){ insert_key->next = list1->next; list1->next = insert_key; return list1; } else{ node* p = list1; for(p = list1; p->next!=NULL;p=p->next); p->next = insert_key; insert_key->next = NULL; return list1; } } // ( ) node* sort_list(node* list1){ int length = length_list(list1); if(length==0){ // 0 , return list1; } for(int i=1;inext; for(int j=0;jdata>p->next->data){ p->data+=p->next->data; p->next->data = p->data - p->next->data; p->data = p->data - p->next->data; } p=p->next; } } return list1; } // node* reverse_list(node* list1){ if(list1==NULL||list1->next==NULL){ return list1; } node *p1, *p2, *p3; node *head = (node*)malloc(sizeof(node)); p1 = list1; p2 = p1->next; while(p2!=NULL){ p3 = p2->next; p2->next = p1; p1 = p2; p2 = p3; } list1->next->next=NULL; head->next = p1; list1 = head; return list1; } // void delete_all(node* list1){ node* p1=NULL,*p2 = NULL; p1 = list1->next; while(p1->next!=NULL){ p2 = p1->next; free(p1); p1 = p2; } free(p2); list1->next=NULL; } void main() { node* List1 =createList(5); // printList(List1); // printf("%d
    ",length_list(List1)); // List1 = delete_key(List1,3); // List1 = insert_list(List1,66,1); // List1 = insert_list(List1,77,0); // List1 = sort_list(List1); // printList(List1); List1 = reverse_list(List1); // printList(List1); delete_all(List1); // printf("%d
    ",length_list(List1)); return; }

    2つのアクションを追加します.ヘッド挿入と中間ノードの検索:
    //     
    node* create_list_headIN(const int length){
        node* head = (node*)malloc(sizeof(node));
        node* p;    
        for(int i=0;idata = i;         
            p->next = head->next;
            head->next = p;            
        }
        head ;
        return head;
    }
    
    //        
    node* middle_node(node* list1){
        node *p1,*p2;
        p1 = p2 = list1;
        while(p2 && p2->next){
            p1 = p1->next;
            p2 = p2->next->next;
        }
        printf("
    %d
    ",p1->data); return p1; }