前の記事の次に、この記事では、リンクリストの操作方法について説明します。
リンクリストを作成する
mallocまたはnewを使用して複数の分散ノードを取得できるようになりました次のステップは、これらの分散ノードをリンクすることです。非常に単純で、各ノードの次のポインタを次のノードのアドレスにポイントするだけです。コードは次のとおりです。
//定义结构体已经在上一篇文章中写过了,这里就直接用了
ndoe* node1 = new node;
ndoe* node2 = new node;
ndoe* node3 = new node;
ndoe* node4 = new node;
ndoe* node5 = new node;
node1->data = 5;//数据域赋值
node1->next = node2;
node2->data = 3;
node1->next = node3;
node3->data = 6;
node1->next = node4;
node4->data = 1;
node1->next = node5;
node5->data = 2;
node1->next = NULL;
このメソッドは非常に明確に見えますが、少し冗長なので、forループを使用して実装しましょう。
#include<stdio.h>
#include<stdlib.h>
strcut node{
int data;
node* next;
};
//创建链表
node* create(int array[]){
node *p,*pre,*head;
head = new head; //创建头结点
head->next = NULL; //指针域置为空
pre = head; //pre记录头结点
for(int i=0;i<5;i++){
p = new node; //新建结点
p->data = array[i]; //给其数据域赋值
p->next = NULL; //新建结点的指针域为NULL
pre->next = p; //前驱结点的指针域设置为当前新建结点的地址
pre = p; 把pre设置为p,作为下个结点的前驱结点
}
return head; //返回结点头指针
}
int main(){
int array[5] = {5,3,6,1,2};
node* L= create(array); //新建链表,返回头指针head赋值给L
L= L->next;
while(L != NULL){
printf("%d",L->data); //输出每个结点的数据域
L = L->next;
}
return 0;
}
要素の
検索リンクされたリストがある場合、与えられた要素xがあるかどうかを見つける方法は?非常に単純で、最初のノードから開始するだけで、現在のノードのデータフィールドがxと等しいかどうかを常に判断し、等しい場合は、カウンターカウントに1を追加します。これにより、リンクリストの最後の場合、countの値は要素xになります。数。
//再以head为头结点的链表上计数元素x的个数
int search(node* head,int x){
int count = 0;
node* p = head->next; //从一个结点开始
while(p != NULL){ //只要没有到达链表末位
if(p->data == x){
count++; //相等则加一
}
p = p->next;
}
return count; //返回计数器count
}
上記のコード部分は、「リンクリストの作成」部分のコードに直接記述でき、作成関数から返されたヘッドポインターを最初のパラメーターとして直接渡すことができます。
要素の挿入
リンクリストの場合、要素の挿入とは、リンクリストの特定の位置にノードを挿入することを指します。たとえば、要素4をリンクリスト5、3、6、1、2の3番目の位置に挿入すると、リンクリストは5、3、4、6、1、2になります。一部の人々は、いわゆるi番目の位置がこの位置の前または後に挿入されるかどうかを尋ねます。つまり、上記の例は最終的に5,3,6,4,1,2または5,3,4,6,1,2を形成します。実際、3番目の位置に要素4を挿入するということは、挿入が完了した後、3番目の位置にある要素が4であることを意味します。したがって、下の図に示すように、3番目の位置から始まる要素には、挿入する必要がある番号を指定する必要があり
ます。
リンクされたリストの場合、要素を削除すると削除が参照されます。リンクされたリストのすべての値は指定された数xです。たとえば、5,3,6,1,2で6を削除すると、リンクされたリストは5,3,1,2になります次の図に示すように、
削除操作は次のように実行されます
。1.ノードはポインター変数pによって列挙され、別のポインター変数preは、pがノードを指す前駆ノードを示します。
2. pが指すノードがxである場合、次の3つの操作を実行します。
(1)preが指すノードの次のポインターフィールドを、pが指す次のノードに移動します
(2)pが指すポイントを解放します。ノード
(3)のメモリ空間は、pがpreが指すノードの次のノードを指すようにします。
//删除head为头结点的链表中所有数据域为x的结点
void del(node* head,int x){
node* p = head->next; // p从第一个结点开始枚举
node* pre = head;
while(p != NULL){
if(p->data == x){
pre->next = p->next;
delet(p);
p = pre->next;
}else{
pre = p;
p = p->next;
}
}
}
コードのこの部分は、「リンクリストの作成」部分のコードに直接書き込むことができ、作成関数のリターンポインターLを最初のパラメーターとして直接渡すことができます。