シンプルなリンクリストデータ構造の線形形式

- プライマー

今日のあなたに持って来られる新しいデータ構造、リンクリストです!

注文フォームの最後の時間は、あなたは、エントリレベルのデータ構造として、はい、非常に簡単に感じる、と私たちは困難を感じるので、それはまたひどい場合は必要があります!

3つのパラメータをカプセル化する構造を使用して、全体の構造を完全に制御するために、独自のシーケンステーブルの管理構造を使用して、簡単なデータ構造として振り返り、当社のラストオーダーテーブル、、、、現在を表すために使用されるサイズどのように多くのシーケンステーブルの合計の要素、および容量は、保存することができる要素の最大数を表し、そして最後に、これは連続した領域のヒープをポイントへのポインタは本当に私たちのデータを保存するために、そこにあります。

私は、あきらめていないと信じて、私はストレンジネスの多くは、それを減らすことが怖い、我々は今、私のプレゼンテーションを聞いて信じて、練習は1日、完璧になり、単なるデータ構造は、あなたは彼に勝つことができなければなりません!


リストとは何ですか?

このリストのデータ構造のために、私は多くの小さなパートナーはかなり頭痛であると信じて、安心するので、あなたは完全にそれを理解できるようになります!

まず、キーチェーン、およびスカッシュビューで、この「連鎖」という言葉です!

私たちは祈りのビーズ、スカッシュ感じ、私たちのリスト上のビーズの全体的な形状を見て同じ目的を持っている必要がありますと思います!

ここに画像を挿入説明
まず第一に、私たちはそれぞれのビーズがとても各1個の数珠ことを、私たちが見て、見、タッチまたはポインタと考えるだろう、私たちのいずれかのノード、およびビーズとビーズの間の線として見ることができ、 、このラインを通って、次の数珠を見つけることができ、それが私たちのリスト、それではありません!

今度は、リンクリストの実装をシミュレートしてみましょう!

私たちは、時間の最初の要素を挿入するとまず第一に、テーブルの上に何も、デスクトップ上の祈りのビーズ(すなわち、ノード)がなかった、そして、私たちは、最初にすべての、最初の1からラインを祈りビーズの第二の部分を必要としますビーズ、ビーズのうちの第二の歯を介して、そうビーズの文字列である背面のライン、およびと、プロセスをイルカつなぎ合わせビーズのようなラインと、リストに、すなわち、我々は、操作を挿入します!

我々は良いと数珠の商品を見つけました。この時点で、あなたはそれをしたくない、と我々はそれを取り除きたいですか?

多くの小規模パートナーは、直接、改行に、これはあまりにも単純である、と述べているだろうし、その後ビーズを取り出し、その後、十分に壊れた配線接続、ありません!

はい、それはとても簡単です!実際には、上記の場合、同じように、世界の私たちのリストには、それは完全に我々の削除ノード、削除ノードは、我々は唯一のノードが発見される前に削除する必要がある状況をシミュレートされ、そのノードを切り取り、削除線(ポインタ)ノード間、および、直接ノードにいわゆる完全な欠失ではないノード、後に削除されるべきです。

だから、実際には、リストは難しいことではありません!

次に、私たちのリストを達成するために、上記のプロセスをシミュレートするためにコードを使用する方法で見てみましょう!


リンクリストの実装

私たちは、注文テーブルの特性を導入し、その後、リストはどのような特徴を持っていますか?のは、見てみましょう!

機能のリスト:
  1. 構築された回避の廃棄物で使用されるスペースは、固定されていません
  2. 各論理的に隣接するノード、必ずしも物理的に
  3. 挿入および欠失は比較的単純である、構造全体を横断していません
  4. インデックスクエリ理由はないので、ならびに配列表を行い、時間複雑度はO(N)であります
ノードと、ヘッドノードが定義されています
typedef struct N{
    int data;
    struct N * next;
}Node;
//节点

typedef struct{
    Node * head;
    Node * tail;
    int size;
}List;
//头节点
初期化リスト
List * init_list(List * p){
    p->head = (void *)0;
    p->tail = (void *)0;
    p->size = 0;
    return p;
}//初始化链表
空のリスト
List * clear_list(List * p){
    while(p->head){
        Node * del = p->head;
        p->head = del->next;
        free(del);
    }
    p->tail = (void *)0;
    p->size = 0;
    return p;
}//清空链表
破壊一覧
void * destroy_list(List * p){
    clear_list(p);
}//销毁链表
テール補間
List * push_back_list(List * p, int data){
    Node * new_node = make_node(data);
    if(!new_node){
        return (void *)0;
    }
    p->tail->next = new_node;
    p->tail = new_node;
    p->size++;
    return p;
}//尾部插入元素
ヘッド補間
List * push_front_list(List * p, int data){
    Node * new_node = make_node(data);
    if(!new_node){
        return (void *)0;
    }
    new_node->next = p->head;
    p->head = new_node;
    p->size++;
    if(p->size == 1){
        p->tail = new_node;
    }
    return p;
}//头部插入元素
ヘッドは、法律を削除しました
List * pop_front_list(List * p){
    if(p->size == 0){
        return (void *)0;
    }
    Node * del = p->head;
    p->head = p->head->next;
    free(del);
    p->size--;
    if(p->size == 0){
        p->tail = (void *)0;
    }
    return p;
}//头部删除元素
テールパンクチャリング方法
List * pop_back_list(List * p){
    if(p->size == 0){
        return (void *)0;
    }
    Node * del = p->tail;
    Node * tem = p->head;
    if(p->size == 1){
        p->head = p->tail = (void *)0;
    }else{
        while(tem->next != p->tail){
            tem = tem->next;
        }
        tem->next = (void *)0;
        p->tail = tem;
    }
    free(del);
    p->size--;
    return p;
}//尾部删除元素
リストを印刷
void print(List * p){
    Node * tem = p->head;
    if(tem){
        printf("现在有%d个元素,分别是:%d",p->size, tem->data);
        tem = tem->next;
        while(tem){
            printf("、%d",tem->data);
            tem = tem->next;
        }
        printf("\n");
    }else{
        printf("链表为空!\n");
    }
}//打印链表
場所指定された要素を探します
Node * find_list(List * p, int data){
    if(p->size == 0){
        return (void *)0;
    }
    Node * tem = p->head;
    while(tem && tem->data == data){
        tem = tem->next;
    }
    return tem;
}//查找指定元素
指定された場所の要素を削除します。
List * erase_list(List * p, Node * pos){
    if(p->size == 0 || pos == p->tail){
        return (void *)0;
    }
    if(pos == (void *)0){
        return pop_back_list(p);
    }
    Node * del = pos->next;
    pos->next = del->next;
    p->size--;
    if(del == p->tail){
        p->tail = pos;
    }
    free(del);
    return p;
}//删除指定
指定された位置にある要素を挿入
List * insert_list(List * p, Node * pos, int data){
    if(p->size == 0 || pos == (void *)0){
        return push_front_list(p , data);
    }
    if(pos == p->tail){
        return push_back_list(p , data);
    }
    Node * new_node = make_node(data);
    if(!new_node){
        return (void *)0;
    }
    new_node->next = pos->next;
    pos->next = new_node;
    p->size++;
    return p;
}//在指定位置插入元素
テストコード
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
    int i;
    List list;
    init_list(&list);
    push_front_list(&list, 1);
    push_front_list(&list, 2);
    print(&list);
    push_back_list(&list, 3);
    push_back_list(&list, 4);
    print(&list);
    pop_front_list(&list);
    pop_back_list(&list);
    print(&list);
    insert_list(&list,find_list(&list, 3) , 5);
    print(&list);
    erase_list(&list, find_list(&list, 5));
    print(&list);
    clear_list(&list);
    print(&list);
    destroy_list(&list);
    return 0;
}
結果は

ここに画像を挿入説明

これは、リストの実現をもたらすまでの時間で、次回は、誰にでも注文スタックとスタックを実現するためにチェーンをもたらすでしょう!ありがとう~~~~~~~~~

公開された11元の記事 ウォンの賞賛0 ビュー321

おすすめ

転載: blog.csdn.net/weixin_43754669/article/details/104046726
おすすめ