リンクリストで実行できる操作はたくさんあります。次に、リンクリストでの高度な操作について説明します。
まず、隣接ノードがどのように交換されるかについて説明しましょう
1つは、最初にリンクリストを作成する
コードに直接移動します(リンクリストの作成方法がわからない学生は、私の最後の記事を読むことができます)
//需要的两个头文件
#include<stdio.h>
#include<stdlib.h>
//定义结构体(包含指针域和数据域)
typedef struct Node
{
int data;
struct Node *next;
} Node;
int main()
{
Node *p1,*p2; //定义两个指针进行各种操作(可看我的上一篇文章)
Node *head; //定义head指针标记头结点
int x;
head = NULL;
printf("请输入创建多少个链表:");
scanf("%d",&x);
// 创建链表节点并连接
for(int i=1;i<=x;i++)
{
p1 = (Node *)malloc(sizeof (Node));
if(head == NULL)
{
head = p1;
p2 = p1;
}
else
{
p2->next =p1;
p2 = p1;
}
}
p2->next = NULL; //把尾结点标记为NULL
p = head;
現時点では、リンクリスト図は次のとおりです。
リンクリストの順序はすでに修正されています。交換2ノードと3ノードなど、リンクリスト内の隣接ノードの位置を交換する場合はどうすればよいですか?2つのポインタでそれを達成する方法は?
2.最初に、2番目と3番目のノードの位置を変更してみます
交換後の位置は1→3→2→4→...つまり、ノード1を3の位置に、ノード2を4の位置に向けてから、2,3ノードを反転する必要があります。 2,3ノード交換を実現します。
操作を図に示します。
この絵はあまり直感的ではないようです。。わからなくても自分で考える必要があります実際、1→2→3→4は1→3→2→4になります
コードに直接:
为方便理解,我们先定义三个指针*p,*p1,*p2分别指向1,2,3的位置
即:p = head;
p1 = p->next;
p2 = p1->next;
调换位置的操作:
p->next = p2; 1指向3的位置
p1->next = p2->next; 2指向4的位置
p2->next = p1; 3又指向2的位置
3.データの入出力、操作が正しいか確認してください
输入数据
int q=1;
while (p != NULL)
{
p->data = q;
q++;
printf("%d ",p->data);
p = p->next;
}
printf("\n");
输出数据:
p = head;
while (p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
演算結果:
请输入创建多少个链表:4
1 2 3 4
1 3 2 4
--------------------------------
Process exited after 4.014 seconds with return value 0
请按任意键继续. . .
位置2、3を切り替える操作は成功しました
リンクリスト内のすべてのノードの奇数と偶数の位置を交換するにはどうすればよいですか?
これはルームメイトへの質問です。おそらく1と2のポジション交換と3と4のポジション交換を実現することでしょう。私は30分勉強しました。あなたと私の考えを共有するためにそれを送りたいと思います。 。
私の考えについて話す
実際、先ほどお話ししたのは、隣接するポジションを交換する高度な操作です。ループをもう1つ追加するだけです。3つのポインターを定義する利点は、pポインターを使用して位置をマークし、p1とp2を使用して位置を交換する機能を実現することです。
上記からわかるように、2つのノードの位置を交換するには、少なくとも、交換されたノードの前の1つの位置を知る必要があります。つまり、ノード2、3の位置を変更する場合は、ノード1の位置を知っている必要があります。そうしないと、ノード1がノード3の位置を指すことができず、操作が失敗します。
注:ノード1、2の位置が交換されている限り、前のノードの位置をマークする必要がないため、特殊化する必要があります(最初にこれら2つの位置を置き換えます)
1.最初にノード1、2の位置を変更します
代码如下:
p1=head; p1指向1 节点的位置
p2=head->next; p2指向2 节点的位置
head=p2; 因为2节点要变成头结点,所以p2标记为head
p1->next = p2->next; 1指向3
p2->next = p1; 2指向1
已经完成了1,2节点位置的调换
次に、設計サイクル後のノードの位置が交換されます
pノードは偶数ノードの位置をマークする必要があることがわかりました。つまり、3と4を交換すると2つのノードがマークされ、5と6を交換すると4つのノードがマークされます。
奇数から偶数まで常にp1だからです。したがって、交換が完了した後、pを使用してp1の位置をマークします。
コードに直接:
调换:
p = p1; 标记上一次调换完成后p1的位置
for(a=1;a<=(x/2)-1;a++) for循环语句,由于已经调换了1,2,所以循环次数-1
{
p1 = p->next;
p2 = p1->next; p→p1→p2
p->next = p2;
p1->next = p2->next; 进行调换奇数偶数节点的调换
p2->next = p1;
p=p1; 标记调换完成后p1的位置
}
3.リンクリストのデータを出力し、動作が正しいか確認してください。
代码如下:
p = head;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
演算結果:
请输入创建多少个链表:9
反转前:1 2 3 4 5 6 7 8 9
反转后:2 1 4 3 6 5 8 7 9
--------------------------------
Process exited after 2.78 seconds with return value 0
请按任意键继续. . .
高度な操作は今後随時更新されますので、どなたでも気に入ってコレクションをフォローして
いただければ幸いです〜ご不明な点がございましたら、一緒にご相談ください。よろしくお願いします。