リスト構造の任意の位置に要素を挿入するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
po_po
記事: 38
登録日時: 10年前

リスト構造の任意の位置に要素を挿入するプログラム

#1

投稿記事 by po_po » 9年前

あるリストと値nと挿入する要素を受け取ってリストのn番目にそれを挿入する関数を作ったのですが、これは正しく動くのですが

コード:

struct node *list_add(struct node *list ,long n,long data){
  struct node* head = list;
  long i;
  node *add = (node *)malloc(sizeof(node));
	add->data = data;
	if(n == 1){
		add->next = list;
		list = add;
		head = add;
	}else{
  for(i = 0; i < n-2; i++){
    list = list->next;
  }
    add->next = list->next;
	list->next = add;
}
	return head;
}
こっちのプログラムはうまく動きません。どちらも同じことをしていると思うのになぜ結果が違うのでしょうか。教えて下さい。

コード:

struct node *list_add(struct node *list ,long n,long data){
  struct node* head = list;
  long i;
  node *add = (node *)malloc(sizeof(node));
	add->data = data;
	if(n == 1){
		add->next = list;
		list = add;
		head = add;
	}else{
  for(i = 0; i < n-1; i++){
    list = list->next;
  }
    add->next = list;
	list = add;
}
	return head;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: リスト構造の任意の位置に要素を挿入するプログラム

#2

投稿記事 by みけCAT » 9年前

まだ詳しい解析はしていないですが、2番目のコードの15行目

コード:

list = add;
は、どうせ捨てられる仮引数への代入であり、その後listが全く使われていないので、怪しいですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: リスト構造の任意の位置に要素を挿入するプログラム

#3

投稿記事 by みけCAT » 9年前

最初のプログラムでは、nが1でないとき、以下のようにリストの更新が行われます。
list-20160426-1.png
最初のプログラムの動作
list-20160426-1.png (15.56 KiB) 閲覧数: 2521 回
2番目のプログラムでは、nが1でないとき、以下のようにリストは全く更新されず、メモリリークが発生します。
list-20160426-2.png
2番目のプログラムの動作
list-20160426-2.png (15.17 KiB) 閲覧数: 2521 回
オフトピック
しかしインデントが汚いコードだなあ…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る