トピックの要件
この質問には 2 つの関数の実装が必要です。それぞれ、読み取られたデータを単一リンク リストとして保存し、指定された値を保存するリンク リスト内のすべてのノードを削除します。リンク リスト ノードは次のように定義されます。
struct ListNode { int data; ListNode *next; };関数インターフェイス定義: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );関数 readlist は、標準入力から一連の正の整数を読み取ります。 、「読み取り順序で単一リンクリストを作成する」によると。-1 が読み取られた場合、入力が終了したことを意味し、関数は単一リンク リストのヘッド ノードへのポインタを返す必要があります。
関数 deletem は、単結合リスト L に m を格納しているすべてのノードを削除します。結果として得られるリンク リストのヘッド ノードへのポインタを返します。
審判テスト手順の例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int m;
struct ListNode *L = readlist();
scanf("%d", &m);
L = deletem(L, m);
printlist(L);
return 0;
}
/* 你的代码将被嵌在这里 */
入力例:
10 11 10 12 10 -1
10
出力例:
11 12
問題解決のアイデア
指定されたコードと組み合わせると、コードの実装プロセスを次のように分析できます。
readlist() 関数を使用して入力データをリンク リストに保存し、次に deletem() 関数を呼び出してリンク リスト内の指定された要素を削除し、最後に printlist() 関数を使用して最終的なリンク リストの結果を出力します。
このうち、struct ListNode はリンク リスト ノード構造であり、2 つのメンバ変数を含みます。int data は現在のノードに格納されているデータを示し、struct ListNode *next は次のノードへのポインタを示します。
-
関数 void printlist(struct ListNode *L) は、リンク リスト全体を走査し、各ノードの値を出力するために使用されます。
-
関数 struct ListNode *readlist() は、入力データを読み取り、リンクされたリストを生成するために使用されます。
-
関数 struct ListNode *deletem(struct ListNode *L, int m) は、リンク リスト内の値が m であるすべてのノードを削除し、処理されたリンク リストを返すために使用されます。
コード
struct ListNode *readlist() // 读取链表
{
struct ListNode *head,*p1,*p2; // 定义头结点和两个临时指针变量
int n=0; // 定义节点数量
head = NULL; // 初始化头结点为空指针
p1 = p2 = (struct ListNode*)malloc(sizeof(struct ListNode)); // 开辟新空间
scanf("%d",&p1->data); // 从键盘上读入第一个节点的数据
while(p1->data!=-1) // 如果当前节点不是最后一个节点
{
n++; // 记录节点个数
if(n==1) // 如果是头节点
head = p1; // 将当前节点作为头结点
else
p2->next = p1; // 将前一个节点指针指向当前节点
p2 = p1; // 将 p1 赋值给 p2,以便在下一次循环中使用
p1 = (struct ListNode*)malloc(sizeof(struct ListNode)); // 为下一节点开辟新空间
scanf("%d",&p1->data); // 读入下一个节点的数据
}
p2->next = NULL; // 最后一个节点指向 NULL
return head; // 返回头结点指针
}
struct ListNode *deletem( struct ListNode *L, int m ) // 删除指定元素
{
struct ListNode *p1,*p2; // 定义两个指针变量
p1 = L; // 将 L(链表的头结点)赋值给 p1
while(p1!=NULL) // 循环遍历链表
{
if(p1->data==m) // 如果当前节点存储的数据等于待删除的数 m
{
if(p1==L) // 如果当前节点是头节点
L = p1->next; // 将头指针指向当前节点的下一个节点,即删除头节点
else
p2->next = p1->next; // 将前一个节点的指针指向当前节点的下一个节点,即删除中间节点或尾节点
}
else
{
p2 = p1; // 将 p1 赋值给 p2,以便在下一次循环中使用
}
p1 = p1->next; // 将 p1 指向下一个节点
}
return L; // 返回操作后的链表
}
完全なコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data; // 当前节点存储的数据
struct ListNode *next; // 指向下一个节点的指针
};
struct ListNode *readlist(); // 读取链表
struct ListNode *deletem( struct ListNode *L, int m ); // 删除指定元素
void printlist( struct ListNode *L ) // 输出链表
{
struct ListNode *p = L;
while (p) {
// 循环遍历链表
printf("%d ", p->data); // 输出当前节点的数据
p = p->next; // 寻找下一个节点
}
printf("\n");
}
int main()
{
int m; // 定义待删除的数
struct ListNode *L = readlist(); // 读取链表
scanf("%d", &m); // 从键盘上输入待删除的数
L = deletem(L, m); // 删除待删除的数并返回操作后的链表
printlist(L); // 输出最终的链表
return 0;
}
struct ListNode *readlist() // 读取链表
{
struct ListNode *head,*p1,*p2; // 定义头结点和两个临时指针变量
int n=0; // 定义节点数量
head = NULL; // 初始化头结点为空指针
p1 = p2 = (struct ListNode*)malloc(sizeof(struct ListNode)); // 开辟新空间
scanf("%d",&p1->data); // 从键盘上读入第一个节点的数据
while(p1->data!=-1) // 如果当前节点不是最后一个节点
{
n++; // 记录节点个数
if(n==1) // 如果是头节点
head = p1; // 将当前节点作为头结点
else
p2->next = p1; // 将前一个节点指针指向当前节点
p2 = p1; // 将 p1 赋值给 p2,以便在下一次循环中使用
p1 = (struct ListNode*)malloc(sizeof(struct ListNode)); // 为下一节点开辟新空间
scanf("%d",&p1->data); // 读入下一个节点的数据
}
p2->next = NULL; // 最后一个节点指向 NULL
return head; // 返回头结点指针
}
struct ListNode *deletem( struct ListNode *L, int m ) // 删除指定元素
{
struct ListNode *p1,*p2; // 定义两个指针变量
p1 = L; // 将 L(链表的头结点)赋值给 p1
while(p1!=NULL) // 循环遍历链表
{
if(p1->data==m) // 如果当前节点存储的数据等于待删除的数 m
{
if(p1==L) // 如果当前节点是头节点
L = p1->next; // 将头指针指向当前节点的下一个节点,即删除头节点
else
p2->next = p1->next; // 将前一个节点的指针指向当前节点的下一个节点,即删除中间节点或尾节点
}
else
{
p2 = p1; // 将 p1 赋值给 p2,以便在下一次循环中使用
}
p1 = p1->next; // 将 p1 指向下一个节点
}
return L; // 返回操作后的链表
}
要約する
この質問では、リンク リストの指定された要素の作成、走査、削除など、リンク リストの基本操作を調べます。
さらに、動的メモリ割り当て関数malloc
や。
私は邱です、また会いましょう。