C言語のリンクリストは、ストレージを動的に割り当て、ノードのデータ型を定義し、ノードの追加、削除、変更などを実装できるデータ構造です。
リンク リストは一般的な基本データ構造であり、ここでは構造ポインタが最大限に活用されます。リンク リストはストレージを動的に割り当てることができます。つまり、リンク リストは非常に強力な配列です。ノード内で複数のデータ型を定義でき、必要に応じてノードを追加、削除、挿入できます。次に、C言語のリンクリストについて記事で詳しく紹介しますので、ご参考になれば幸いです。
【おすすめコース:C言語チュートリアル】
リンクされたリストには、アドレスを格納するヘッド ポインター (通常は head で表されます) があります。リンクリストのノードはヘッドノードと一般ノードに分かれており、ヘッドノードにはデータフィールドがありません。リンクされたリストの各ノードは、データ フィールドとポインター フィールドの 2 つの部分に分割されます。リンクされたリストはチェーンのようなものです。先頭は最初の要素を指します。最初の要素は 2 番目の要素を指します。...最後の要素まで、その要素は他の要素を指しません。これは「末尾」と呼ばれます。アドレス部分には「NULL」(「空のアドレス」という意味)が格納され、リンクリストはここで終了します。強力な機能を備えたリンク リストなので、リンク リストの作成、変更、削除、挿入、出力、並べ替え、逆順、リンク リストの要素のクリア、リンクの長さの検索など、さまざまな操作が可能です。リストなどリンク リストの学習の初心者は、通常、一方向のリンク リスト
#空のリンク リスト#--->NULL
head
---->[p1]---->[p2]...---->[pn]---->[NULL] head p1->next p2->next pn->next
リンク リストの作成
一般に、構造変数を定義するときに LinkList *a; を直接使用して定義できるため、typedef struct を使用してリンク リストを作成します。構造型変数。
typedef struct student{ int score; struct student *next; } LinkList;
LinkList *creat(int n){ LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点; head = (LinkList*)malloc(sizeof(LinkList));//分配地址 end = head; //若是空链表则头尾节点一样 for (int i = 0; i < n; i++) { node = (LinkList*)malloc(sizeof(LinkList)); scanf("%d", &node->score); end->next = node; end = node; } end->next = NULL;//结束创建 return head; }
変更 リンク リストのノード値は非常に単純です。以下は、値を変更するためにリンク リストと変更対象のノードを渡す関数です。 void change(LinkList *list,int n) {//n为第n个节点
LinkList *t = list;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
puts("输入要修改的值");
scanf("%d", &t->score);
}
else {
puts("节点不存在");
}
}
リンク リストの要素を削除するとは、前のノードのポインタ フィールドを、削除するノードを超えた次のノードに渡すことを意味します。 。つまり、 p->next = q->next; そしてノード q のスペースを解放します、つまり free(q);
void delet(LinkList *list, int n) { LinkList *t = list, *in; int i = 0; while (i < n && t != NULL) { in = t; t = t->next; i++; } if (t != NULL) { in->next = t->next; free(t); } else { puts("节点不存在"); } }
ノードを挿入すると、データをリンクするために挿入する前にノードのポインター フィールドが使用されることがわかります。挿入したノードのフィールドに挿入し、そのノードを挿入します。 ポインタフィールドのリンクが次のノードのデータフィールドに挿入されます。図によると、ノードの挿入は次のようになります: e->next = head->next; head->next = e; リンク リスト ノードの追加には、2 つの構造体ポインターと 1 つの int データが使用されます。
void insert(LinkList *list, int n) { LinkList *t = list, *in; int i = 0; while (i < n && t != NULL) { t = t->next; i++; } if (t != NULL) { in = (LinkList*)malloc(sizeof(LinkList)); puts("输入要插入的值"); scanf("%d", &in->score); in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点 t->next = in;//填充t节点的指针域,把t的指针域重新指向in } else { puts("节点不存在"); } }
出力リンク リスト
出力リンク リストは非常にシンプルで、トラバースしながら出力するだけですwhile (h->next != NULL) { h = h->next; printf("%d ", h->score); }
以上がC言語でリンクリストを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。