
2つの線形リストから交互に先頭の要素を外して新しいリストに繋ぎかえる操作を考える。
プログラム全体の動作は以下のようにする。まず端末から要素数を入力すると、プログラム内で 101 から昇順に数が並んだ線形リストを作る。それを半分の長さで分割し list1, list2 という2つのリス トに分け、確認のため要素の並びを表示する。続いて、各リストからそれぞれ先頭の要素を外して新し いリストに繋ぐことを繰り返して、元の要素が交互に並んだリストを作成し、要素の並びを表示する。
関数 list_len は引数で与えられたリストの要素数を返す。
関数 list_show はリスト中の要素の並びを表示する。
関数 add_top は第一引数で指定されたリストの先頭にノード(第二引数で指定された値を持つ)を追
加し、追加後のリストを返す。
関数 divide は与えられたリストを、先頭から指定個数の要素を持つ前半と、残りの要素からなる後
半に分割し、後半のリストを返す。以下の方針で作成せよ。
・空のリストには空を返す。 ・分割位置が1なら、先頭の一要素のみのリストとそれ以降のリストに分割し、後者のリストを返す。 ・位置が1より大きい場合は、先頭要素を外したリストについて、位置を1減らし divide を再帰的に
呼び出す。
・なお引数で指定される分割位置は1以上としてよい。
関数 merge は、再帰的に2つのリストから要素を交互に取って合体させたリストを作成し、出来たリ ストを返す。以下の方針で作成せよ。
・引数で与えられた2つのリストの片方が空なら、他方のリストを返す。 ・そうでなければ(どちらにも1つ以上の要素があるので)、それぞれの先頭要素を外して繋ぎ、その
後ろに残りを merge したものを再帰的に繋ぐ。この関数が merge(a,b)と呼ばれたら、 a が先頭の一要素 ah と残りのリスト at(要素数ゼロの NULL もあり得る)に分割でき、b も bh と bt に分割できるとして、ah の後ろ に bh を繋ぎ、その後ろに at と bt を merge したものを繋いだリストを作って返せばよい。
問題:関数 divide (分割)、関数 merge を完成させよ。ソースコードと、入力として 11 と 12 を与えた2通りの実行結果を提出せよ
#include <stdio.h>
#include <stdlib.h>
struct node {
int val;
struct node *next;
};
typedef struct node *LIST;
LIST divide(LIST x, int p) ;
LIST merge(LIST x, LIST y) ;
int list_len(LIST x) {//リストの要素数を求める関数
if (x == NULL) return 0;
return 1 + list_len(x->next);
}
void list_show(char *m, LIST x) {//リストにある値を表示する関数
printf("%s:", m);
while (x != NULL) {
printf("%d ", x->val);
x = x->next;
}
printf("\n");
}
LIST add_top(LIST x, int v) {//リストxの先頭に、値vを繋げたリストを返す関数
LIST t;
t = (LIST) malloc(sizeof(struct node));
if (t == NULL) {
printf("malloc failed");
exit(-1);
}
t->val = v;
t->next = x;
return t;
}
int main(void) {
int i, len;
LIST list1 = NULL, list2, mix;
printf("length: ");fflush(stdout);
scanf("%d", &len);
for (i = len; i >= 1; i--)
list1 = add_top(list1, 100+i);
list2 = divide(list1, list_len(list1) / 2);
list_show("list1", list1);
list_show("list2", list2);
mix = merge(list2, list1);
list_show("mixed", mix);
return 0;
}
LIST divide(LIST x, int p) {//長さp でリストを分割する関数
//// ここを完成させる
}
LIST merge(LIST x, LIST y) {//二つのリストをマージする関数
//// ここを完成させる
}
divide関数のところには
for(p=0;p>1;p--)
if(x=NULL){
return 0;
}else if(p==1){
return x=x->next;
}
}
marge関数のところを教えていただきたいです。またdivide関数のところも不備があれば教えて教えていただきたいです。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
あ、返すもんが違った。
merge(,) の最終行
return dummy->next; に修正して。
ついでに、リストを分けるとこ
LIST split(LIST x) {
LIST y, ynext;
int n = 0;
for( y = x; x != NULL; x = x->next )
if( n++ & 1 ) y = y->nex;
ynext = y->next;
y->next = NULL;
return ynext;
}
No.2
- 回答日時:
marge関数のところ
ここも普通、再起は使わないでしょ。
LIST merge(LIST x, LIST y) {
struct node dummy;
LIST ztail = &dymmy, xrest;
while( x != NULL ) {
ztail->next = x;
xrest = x->next;
// x->next = NULL;
x = y;
y = xrest;
}
ztail->next = y;
return &dummy;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- その他(データベース) Microsoft Accessについて 1 2022/06/06 16:20
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テンソル解析(絶対微分学)は...
-
含む含まないという概念自体の...
-
tdに対してmin-heightの定義、...
-
自分は今人生の転換期にいると...
-
質問1.
-
既婚男女の方、結婚前と結婚後...
-
aの中にspan
-
textareaの幅を画面と合わせたい
-
親要素・子要素
-
NからZへの全単射を具体的に構...
-
【ヒトの神秘】美男美女から何...
-
指定したidやclass以外の要素を...
-
smallにtext-allignが効かない
-
input type="hidden"で取得した...
-
emとstrongの反対
-
リストについて
-
ホームページ作成ソフトKompoZe...
-
還暦を過ぎた方々に質問です。
-
メールアドレス(グループ)の...
-
初歩的な質問です。<div>のwidt...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既婚男女の方、結婚前と結婚後...
-
含む含まないという概念自体の...
-
テキストボックスの中にリンク...
-
質問1.
-
改行ほどは行かないけど、若干...
-
NからZへの全単射を具体的に構...
-
input type="hidden"で取得した...
-
smallにtext-allignが効かない
-
aの中にspan
-
HTML の繰返し法???
-
下線と文字の間を調整するには...
-
角丸画像の背景色を透明にした...
-
html タグの閉じスラッシュ前の...
-
CSS:overflow要素の印刷について
-
HTMLページ上でiframeを最前面...
-
CSSで改行後の行間調整
-
tdに対してmin-heightの定義、...
-
H1タグを画像にしたい
-
スタイルシートで文字色を指定...
-
textareaの幅を画面と合わせたい
おすすめ情報