単独で、リストのデータ構造リストをリンク-----

最近では何かが、数時間後に痛みで、それはいくつかの痛みのときリストで学ぶために始めて、データ構造の知識を検討している、最終的に何かを得ることを、コンピュータ、このレコードを見て準備します

プロパティリスト----

①:ポインタを介して隣接する素子間の接続。
②:NULLへの最後の要素の後継ポインタ。
③:スペースリストは必要に応じて割り当てることができます。
④:無駄なメモリ空間を。

単独リンクリスト

一般的に複数のノードを含む、単独でリンクされたリストを参照し、各ノードは、後続(次)ポインタの次の要素へのポインタを有しています。次の表は、最後のノードは、リストの終わりを示す、NULLです。
実装の単純なリスト:

ノードを生成するために使用される構造体の定義:

typedef struct node
{
    int date;
    struct node *next;    
}Node;

構造体ノードタイプの代わりに使用される後続の手順で、構造を定義する構造体ノードノード(簡単な変更及び操作に)起こります。

第1ノードと尾ノードのリストを格納するために使用される構造体の定義:

typedef struct node
{
    Node *head;
    Node *tail;
}LNode;

この構造は、二つのノードに格納される(アドレス!!!!)直接ではなく、彼の値に!
1元のオリジナルリスト生成(空のリストを、任意のノードへのポイントが存在しません)

LNode *createlist()
{
    LNode *list=(LNode *)malloc(sizeof(*list));
    list->head=NULL;
    list->tail=NULL;
    return list;
}

ノートポインタ戻り値の型と関数型で、元の呼び出し元の関数に返される新しいリストを生成します。

元のリストに割り当てられています:

void crea(LNode *list)
{    
    while(1)
    {
        int i;
        scanf("%d",&i);
        if(i==100)
        {
            break;
        }
        //生成孤立结点
        Node *pnew=(Node *)malloc(sizeof(*pnew));    //注意这里要在while()里面定义和分配空间!!!
        pnew->next=NULL;                            //因为每添加一个新结点就需要多增加一块存储空间!!!
        pnew->date=i;                                //这里错  1  次!!
//判断链表是否为空链表,是空链表就让链表的头和尾都指向孤立结点
        if(list->head==NULL)//注意不能直接用head!!!    //这里错  1  次!!
        {
            list->head=pnew;    
            list->tail=pnew;
        }
        else            //不是孤立结点就插入结点生成链表
        {
            list->tail->next=pnew;    //尾插法;1.让原链表的next指向新结点,
                                    //使新结点成为原链表尾结点的下一个结点;
            list->tail=pnew;        //2.让原链表的尾结点指向新结点,更新尾结点的位置;
        
        //    pnew->next=list->head;    //头插法:1.让新结点的next指向原链表的头结点;
        //    list->head=pnew;        //2.让原链表的头结点指向新结点,更新头结点的位置;
        }
    }
}

リストを印刷します:

void print(LNode *list)
{
    if(list->head==NULL)    //若链表为空,直接退出
    {
        return ;
    }
    Node *p=list->head;        //注意这里p指向的是链表的头结点,p的类型是结点型的!!不是链表型的。
    while(p)                
    {
        printf("%d  ",p->date);        
        p=p->next;            //对结点进行操作!!
    }
    printf("\n");
}

2.打印并销毁链表
void print(LNode *list)
{
    if(list->head==NULL)    //若链表为空,直接退出
    {
        return ;
    }
    Node *p=list->head;        //用来指向要打印的结点
    Node *pre=NULL;            //用来指向打印完的结点
    while(p)                
    {
        printf("%d  ",p->date);
        pre=p;                //指向打印完的结点
        p=p->next;
        free(pre);            //销毁打印完的结点(释放其所占空间),即逐渐销毁链表所有的结点。
    }
    printf("\n");
    free(list);                //把空链表也销毁
}

質問があれば、指摘してください
私たちが一緒に進行することを

公開された12元の記事 ウォン称賛17 ビュー2977

おすすめ

転載: blog.csdn.net/qq1140037586/article/details/105356614