質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2774閲覧

線形リストを用いた問題がわかりません。

Red_Bull

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/12/16 05:46

編集2021/12/16 05:55

特定の値のノードを削除する関数 void delX(int x) を実装したいのですがわかりません。
具体的には、入力された数字を数列の何番目かを探すという部分の処理がわからないので教えていただきたいです。

手順は以下の通りです。
1.数列の要素数を入力
2.要素を入力
3.削除する数字を入力
4.入力した数字が削除された数列をprint

terminalは成功した際の出力結果です。

plain

15 21 4 67 2 3 367 41 4 2 3

c

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct node { 5 int val; 6 struct node *next; 7}Node; 8 9Node *head = NULL; 10 11Node* createN(int x) { 12 Node *newnode; 13 newnode = (Node *)malloc(sizeof(Node)); 14 newnode->val = x; 15 newnode->next = NULL; 16 return newnode; 17} 18 19void initL(int n) { 20 int x,i; 21 Node *p; 22 scanf("%d",&x); 23 head = createN(x); 24 p = head; 25 for(i=1;i<n;i++){ 26 scanf("%d",&x); 27 p->next = createN(x); 28 p = p->next; 29 } 30} 31 32void freeL() { 33 Node *p; 34 while(head!=NULL){ 35 p = head->next; 36 free(head); 37 head = p; 38 } 39} 40 41void printN(Node *a) { 42 if(a == NULL) printf("NULL\n"); 43 else printf("%d\n",a->val); 44} 45 46void printL() { 47 Node *p = head; 48 while(p != NULL){ 49 printf("%d ",p->val); 50 p = p->next; 51 } 52 printf("\n"); 53} 54 55Node* getN(int n) { 56 int i; 57 Node *p; 58 p = head; 59 for(i=1;i<n;i++) p = p->next; 60 return p; 61} 62 63int countL() { 64 int ret = 0; 65 Node *p = head; 66 while(p!=NULL){ 67 p = p->next; 68 ret++; 69 } 70 return ret; 71} 72 73Node* searchX(int x) { 74 Node *p; 75 for(p=head; p!=NULL; p=p->next){ 76 if(p->val == x) break; 77 } 78 return p; 79} 80 81void insHead(int x) { 82 Node *p; 83 p = createN(x); 84 p->next = head; 85 head = p; 86} 87 88void insMiddle(int n, int x) { 89 int i; 90 Node *p,*q; 91 p = head; 92 for(i=1;i<n;i++){ 93 p = p->next; 94 } 95 q = createN(x); 96 q->next = p->next; 97 p->next = q; 98} 99 100void insTail(int x) { 101 Node *p; 102 p = head; 103 if(p==NULL){ 104 head = createN(x); 105 return; 106 } 107 while(p->next != NULL){ 108 p = p->next; 109 } 110 p->next = createN(x); 111} 112 113void delHead() { 114 Node *p; 115 p = head; 116 head = head->next; 117 free(p); 118} 119 120void delMiddle(int n) { 121 int i; 122 Node *p,*q; 123 p = head; 124 for(i=1;i<n-1;i++){ 125 p = p->next; 126 } 127 q = p->next; 128 p->next = q->next; 129 free(q); 130} 131 132void delTail() { 133 Node *p; 134 p = head; 135 while(p->next->next != NULL){ 136 p = p->next; 137 } 138 free(p->next); 139 p->next = NULL; 140} 141 142void delX(int x) { 143 int i; 144 Node *p,*q; 145 p = head; 146 147 if(*p==x){ 148 for(i=1;i<x-1;i++) { 149 p = p->next; 150 q = p->next; 151 p->next = q->next; 152 free(q); 153 } 154 } 155} 156 157int main(void) { 158 int i,n,x; 159 scanf("%d",&n); 160 initL(n); 161 scanf("%d",&x); 162 delX(x); 163 printL(); 164 freeL(); 165 return 0; 166}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/16 05:54

terminal と書かれている個所は言語名を書く所です。 画面出力等では plain としてください。
Red_Bull

2021/12/16 06:12

似たような課題をやっていますが、、躓いているところが異なるので教えていただきたいです。
guest

回答3

0

自己解決

delX(int x)の中にint型のcountを作ってfor文を回しました。

投稿2021/12/16 10:23

Red_Bull

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/12/16 15:38

コードを追記してもらえませんか?
guest

0

入力された数字を数列の何番目かを探すという部分の処理がわからない

指定された値を持つノードを探索する関数 searchX が既存であると見えるので,単にこれの実装を使えば終わる話なのではないでしょうか.

投稿2021/12/16 06:51

編集2021/12/16 06:53
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/12/16 07:06 編集

単方向リストからの要素の削除は削除対象の"ひとつ手前"を知る必要があり、ソコに躓いてるのかも。 削除対象の位置:nがわかれば delMiddle(n-1)、って目論見なのかな。
fana

2021/12/16 07:23

「探す」の実装に困っているのかと捉えました. 「探す」処理の実装は自分で考えなくても既にあるからそれを見れば(パクれば)いいよね,という. --- まず「nを見つける処理」を行って → その結果のnの値を用いてもう一回リスト先頭から n-1 まで移動して… …っていう形でもいいけど, searchX の実装をちょっといじくって「n-1の位置にあるノードを得る処理」に仕立て上げるような方向を想定して回答した感じ,とでもいうか.
guest

0

入力された数字を数列の何番目かを探すという部分の処理がわからない

Node* searchX(int x) をいぢくって

int searchIndex(int x) {
xが現れる位置を返す(なかったら-1)
}

を作ってはいかがでしょう。
※ searchX内のfor-loopを何回回ったかを返せばいいよね

投稿2021/12/16 06:46

編集2021/12/16 06:50
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問