C 言語学習 (11) 単一および双方向の循環リンク リスト

1.一方通行ループ:ここで学んだいくつかの関数の機能を整理しました 皆さんと一緒に進歩していきたいと思います 間違いがあればご指摘ください!

以下は、これらの機能の概要であり、この記事の本質でもあります。次の二重リンクのリストにより、教師が残した 3 つのタスクが完了します。

Status init(Node* p);//初期値を割り当てるには、ポインターを変更し、ポインターのアドレスを操作する必要があります**p
Status insert_head(Node p,Elementype value);//挿入関数は最初にアドレスに適用され、 result を返し、ポインター (前後の p->next ポイント) を処理します。
Status insert_tail(Node p,Elementype value);//アプリケーションのアドレスは上記と同じです。
Status insert_index(Node p,int index,Elementype) value);//最初に挿入位置の正当性を判断し、上記のようにスペースを適用し、ポインタのインデックスを回ループし、ポインタを処理します。
void print(Node p);//for ループを使用してリンク リストの出力を完了します。 int
length (Node p);//関数 function は上記と同じで、出力をカスタム出力に変更します。変数をカウントするだけです。戻り値に注意してください。Status delete_index(Node p,
int Index);//削除位置の妥当性を判断し、その位置までループし、ポインタを処理します。
Status delete_value(Node p,Elementype value);//シーケンステーブルを走査して、対応する値を見つけ、上記の関数を呼び出します (i count)。連続対応値
Status update_index(Node p, int Index, Elementtype value);//置換位置の合理性を判断し、対応する位置までループし、値を直接代入 Status update_value(Node p ,Elementype old_name,Elementtype new_name
) ;// シーケンス テーブルを走査し、対応する値を見つけて、新しい値を割り当てます。
Status query_index(Node p, int Index);//位置の合理性を判断し、指定位置までループして値を出力する
Status query_value(Node p,Elementype value);//数列テーブルを走査してiでカウントしながら、対応する値を判定し、i を出力します。

/************************************************ ****
    > ファイル名: 4xunhuan.c
    > 作成者: Li Shang
    > 日期: 2018-08-02 15:38
*********************** ******************************/

#include <stdio.h>
#include <stdlib.h>

#F 0 を定義
#T 1 を定義

typedef int ステータス;
typedef int 要素タイプ;
typedef struct ノード* ノード;

struct ノード
{     要素タイプの値;     構造体ノード* 次; };


Status init(Node* p);//初期値を割り当てるには、ポインタ **p を変更する必要があります。
Status insert_head(Node p,Elementype value);//挿入関数は、最初にアドレスに適用され、結果を返し、その後処理されます。ポインタの
ステータス insert_tail (Node p,Elementype value);//アプリケーションのアドレスは上記と同じです
Status insert_index(Node p,intindex,Elementype value);//最初に挿入位置の正当性を判断し、スペースを適用します、その位置へのポインタをループし、そのポインタを処理 void
print( Node p);
int length(Node p);
Status delete_index(Node p, int Index);//削除位置の妥当性を判断し、その位置までループする、ポインターを処理します。
Status delete_value(Node p,Elementype value);// シーケンス テーブルを走査し、対応する値を見つけ、上記の関数 (i count) を呼び出し、連続する対応する値の処理に注意を払います Status update_index (Node p
, int Index, Elementtype value); // 置換位置の合理性を判断し、該当位置までループし、
Status を直接代入 update_value (Node p,Elementype old_name,Elementype new_name);// シーケンステーブルを走査し、対応する値を見つける、新しい値を代入します
Status query_index(Node p,int index);//位置の合理性を判断し、指定された位置までループして値を出力します
Status query_value(Node p,Elementype value);//シーケンス テーブルを走査して i でカウントしながら、対応する値を決定し、i を出力します

int main()
{     int i;     ノードヘッド。     init(&head);     for (i = 0; i < 10; i++)     {         insert_head(head,i + 1);     プリント     (ヘッド);     for (i = 0; i < 10; i++)     {         insert_tail(head,i + 1);     プリント     (ヘッド);












    update_index(head,2,6);
    プリント(ヘッド);
    
    insert_index(head,2,8);
    プリント(ヘッド);

    delete_index(head,2);
    プリント(ヘッド);

    delete_value(head,6);
    プリント(ヘッド);
    
    update_value(head,8,66);
    プリント(ヘッド);

    クエリ値(head,3);

    query_index(head,6);
    0を返します。
}

ステータス init(Node* p)
{     Node newnode = (Node)malloc(sizeof(struct node));//アニメーション态空间         if(NULL == newnode)     {         return F;     新しいノード-     >次 = 新しいノード;     *p = 新しいノード;     T を返します。}








ステータス insert_head(ノード p,要素タイプ値)
{     ノード newnode = (ノード)malloc(sizeof(struct ノード));     if(NULL == newnode)     {         return F;     新しい     ノード -> 値 = 値;     新しいノード -> 次 = p -> 次;     p -> 次 = 新しいノード;     T を返します。}









ステータス insert_tail(ノード p,要素タイプ値)
{     ノードヘッド = p;     ノード newnode = (ノード)malloc(sizeof(struct ノード));     if(NULL == newnode)     {         return F;     while     (head != p->next)     {         p = p->next;     新しい         ノード->値 = 値;     newnode->next = p->next;     p->next = 新しいノード;     T を返します。}














ステータス insert_index(ノード p,int インデックス,要素タイプ値)
{     int i;     if(インデックス < 0 || インデックス > 長さ(p) - 1)     {         printf("インデックスがエラーです\n");         Fを返します。     ノード     newnode = (ノード)malloc(sizeof(struct ノード));     if(NULL == newnode)     {         return F;     }     for(i = 0;i < インデックス;i++)     {         p = p->next;     新しい     ノード->値 = 値;     newnode->next = p->next;     p->next = 新しいノード;     T を返します。}



















void print(Node p)
{     ノードヘッド = p;     while(head != p->next)     {         printf("%d ",p->next->value);         p = p->next;     printf     ("\n"); }







int length(ノード p)
{     ノードヘッド = p;     int len = 0;     while(head != p->next)     {         len++;         p = p->next;     lenを     返します。}








ステータス delete_index(ノード p,int インデックス)
{     if(インデックス < 0 || インデックス > 長さ (p) - 1)     {         printf("インデックスがエラーです\n");         Fを返します。     int     i;     for (i = 0; i < インデックス; i++)     {         p = p->next;     ノード     温度 = p->next->next;     無料(p->次);     p->next = 一時;     T を返します。













}

ステータスの削除値(ノード p,要素タイプの値)
{     int i = 0;     ノードヘッド = p;     printf("値 = %d\n",値 );     while(head != p->next)     {         if (value == p->next->value)         {             delete_index(head,i);             printf("削除アドレスは %d\n",i );         }         else         {             i++;             p = p->next;     Tを         返し     ます。}

















ステータス update_index(ノード p,int インデックス,要素タイプ値)
{     if(インデックス < 0 || インデックス > 長さ (p) - 1)     {         printf("インデックスがエラーです\n");         Fを返します。     }




    int i;
    for (i = 0; i < インデックス; i++)
    {         p = p->next;     p-     >next->value = 値;     T を返します。}




Status update_value(Node p,Elementype old_name,Elementype new_name)
{     Node head = p;      while(head != p->next)     {         if(p->next->value == old_name)//また間違っています、代入と等しい違いに注意してください         {             p->next->value = new_name;         }         p = p->next;     }     return T; }










Status query_index(Node p,int index)
{     if(index < 0 || Index > length(p) - 1)//挿入位置が正しく入力されているか判定     {         printf("index is error\n");         return F ;     }     int i;     for(i = 0;i < Index;i++)     {         p = p->next;     }     printf("index %d is %d\n",i,p->next->value ); }











ステータスクエリ値(ノード p,要素タイプ値)
{     ノードヘッド = p;      int i = 0;     int フラグ = 0;     printf("必要な値は %d\n",value);     while(head != p->next)     {         if(value == p->next->value)         {             printf("%d ",i);             フラグ++;         }         i++;         p = p->next;     if     (flag == 0)     {         printf("見つかりません\n");     printf     ("\n");     T を返します。}





















 

2. 二重リンク リスト、一部の機能コードが変更され、一方向リンク リストに基づいてデバッグが成功しました。

/************************************************ ***** ****
    > ファイル名: 5shuangxiang.c
    > 作成者: Li Shang
    > 日付: 2018-08-03 15:56
****************** ***** ******************************/

#include <stdio.h>
#include <stdlib.h>

#T 1 を定義
#F 0 を定義

typedef int 要素タイプ;
typedef int ステータス;

struct Node
{     struct Node* 前;     要素タイプの値。     struct Node* next; };



typedef struct Node* ノード;

ステータス init(node* p);
ステータス insert_head(ノード p,要素タイプ値);
void printN(ノード p);
void printP(ノード p);
int 長さ(ノード p);
ステータス insert_tail(ノード p,要素タイプ値);
ステータス insert_index(ノード p,int インデックス,要素タイプ値);
ステータス delete_index(ノード p,int インデックス);
ステータスの削除値(ノード p,要素タイプの値);

int main()
{     ノードヘッド;     init(&head);     int i;     for (i = 0; i < 10; i++)     {         insert_head(head,i+1);     printN     (頭);     printP(ヘッド);








    for (i = 0; i < 10; i++)
    {         insert_tail(head,i+1);     printN     (頭);     printP(ヘッド);



    insert_index(head,5,99);
    printN(ヘッド);

    delete_index(head,6);
    printN(ヘッド);

    delete_value(head,6);
    printN(ヘッド);
    0を返します。
}

ステータス init(node* p)
{     ノード newnode = (node)malloc(sizeof(struct Node));     if(NULL == newnode)     {         return F;     新しいノード-     >次 = 新しいノード;     新しいノード->以前 = 新しいノード;     *p = 新しいノード; }








ステータス insert_head(ノード p,要素タイプ値)
{     ノード newnode = (ノード)malloc(sizeof(struct Node));     if(NULL == newnode)     {         return F;     新しい     ノード->値 = 値;     newnode->next = p->next;     p->next = 新しいノード;     新しいノード->以前 = p;     新しいノード->次->前 = 新しいノード; }










ステータス insert_tail(node p,Elementype value)
{     node newnode = (node)malloc(sizeof(struct Node));     if(NULL == newnode)     {         return F;     新しい     ノード->値 = 値;     /*ノードヘッド = p;     while(head != p->next)     {         p = p->next;     newnode-     >next = head;     p->next = 新しいノード;     ヘッド->前 = 新しいノード;     新しいノード->前 = p;*/     新しいノード->次 = p;     p->前->次 = 新しいノード;     新しいノード->以前 = p->以前;     p->前 = 新しいノード; }



















void printN(node p)
{     ノードヘッド = p;     while(head != p->next)     {         printf("%d ",p->next->value);         p = p->next;     printf     ("\n"); }







void printP(node p)
{     ノードヘッド = p;     while(head != p->prior)     {         printf("%d ",p->prior->value);         p = p->前;     printf     ("\n"); }







int length(node p)
{     int i = 0;     ノードヘッド = p;     while(head != p->next)     {         i++;         p = p->next;     i を返し     ます。}








ステータス insert_index(ノード p,int インデックス,要素タイプ値)
{     if (インデックス < 0 || インデックス > length(p) - 1)     {         printf("インデックスがエラーです\n");         Fを返します。     ノードnewnode     = (ノード)malloc(sizeof(struct Node));     if (NULL == 新しいノード)     {         return F;     int     i;     for(i = 0;i < インデックス;i++)     {         p = p->next;     新しい     ノード->値 = 値;     newnode->next = p->next;     p->next = 新しいノード;     新しいノード->以前 = p;     新しいノード->次->前 = 新しいノード;     T を返します。




















}

ステータス delete_index(ノード p,int インデックス)
{     if (インデックス < 0 || インデックス > 長さ (p) - 1)     {         printf("インデックスがエラーです\n");         Fを返します。     int     i;     for(i = 0;i < インデックス;i++)     {         p = p->next;     ノード     温度 = p->next->next;     無料(p->次);     p->next = 一時;     一時->次->前 = p;     T を返します。}












    



ステータスの削除値(ノード p,要素タイプの値)
{     int i = 0;     ノードヘッド = p;     while(head != p->next)     {         if (value == p->next->value)         {             delete_index(head,i);         }         else         {             i++;             p = p->next;     Tを         返し     ます。}















 

おすすめ

転載: blog.csdn.net/ls_dashang/article/details/81394158