セルを挿入する関数の作成

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

セルを挿入する関数の作成

#1

投稿記事 by SOLAR » 2年前

「キーボードから非負整数を入力し,その非負整数を格納するためのセルを動的に確保し,連結リストの先頭に追加していくプログラムを作成しなさい.入力は負の整数を読み込むまで続けるものとする.」という問題(上記のコード)の挿入部分をinsert関数を作成し実行できるように改造しなさいという問題なんですが(下記のコード),を作成し実行すると -現在の実行-のようにアドレス(?)が出力されてしまいます。どこの部分を修正すればいけないのかご指摘よろしくお願いします。
上記プログラムではgFrontは(ポインタでなく)セルを表す変数そのものでした.そのため,nextメンバを参照するためにgFront.nextのようにドット.を用いました.しかし,今回作成するinsert関数では,挿入したいセルはポインタ(pre)として与えられます.したがって,そのセルのnextメンバを参照するのにドットは使えないことに注意してくださいと書いてあります...
-目標の実行例-
10 20 30 40 50 60 70 80 -1 #キーボード入力
LIST[ 10 ] #10をダミーセルの次に追加
LIST[ 20 10 ] #20をダミーセルの次に追加
LIST[ 30 20 10 ] #30をダミーセルの次に追加
LIST[ 40 30 20 10 ] #以下同様

-現在の実行-
10 20 30 40
LIST[-2144187768 ]
LIST[2026043616 -2144187768 ]
LIST[-208891995 2026043616 -2144187768 ]
LIST[544 -208891995 2026043616 -2144187768 ]

コード:

#include<stdio.h>
#include<stdlib.h>

struct cell{
	int value;			/*このセルが持つデータ*/
	struct cell *next;	/*次のセルを指すポインタ*/
};

/*連結リストの先頭を指すダミーセル,今回はvalueの値を-1にする*/
struct cell gFront = {-1, NULL};

void printList(void){
	struct cell *p;

	printf("LIST[");

	p = gFront.next;
	while(p != NULL){
		printf("%d ",(*p).value);
		p = (*p).next;
	}
	printf("]\n");
}

int main(void){
	int a;
	struct cell *p;

	scanf("%d",&a);
	while(a >= 0){
		p = malloc(sizeof(struct cell));
		if(p == NULL){
			fprintf(stderr,"エラー: malloc失敗\n");
			exit(1);
		}
		(*p).value = a;

		/***********************/
		/*連結リストの先頭に追加する*/
		/**********************/

		/*(1)まず,新しいセルが今の先頭セルを指すようにする*/
		(*p).next = gFront.next;

		/*(2)次に,ダミーセルが新しいセルを指すようにする*/
		gFront.next = p;

		printList();
		scanf("%d",&a);
	}

	printf("入力を終了しました\n");

	return 0;
}

コード:

#include<stdio.h>
#include<stdlib.h>

struct cell{
	int value;
	struct cell *next;
};

struct cell gFront = {-1, NULL};

void printList(void){
	struct cell *p;

	printf("LIST[");

	p = gFront.next;
	while(p != NULL){
		printf("%d ",p->value);
		p = p->next;
	}
	printf("]\n");
}

/************insert関数*******************/
void insert(struct cell *pre, struct cell *new){
	if(pre == NULL || new == NULL)
		fprintf(stderr,"insert: 引数 pre または new がNULLです。\n");

	new -> next = pre -> next;
	pre -> next = new;
}

int main(void){
	int a;
	struct cell *p;

	scanf("%d",&a);
	while(a >= 0){
		p = malloc(sizeof(struct cell));
		if(p == NULL){
			fprintf(stderr,"エラー: malloc失敗\n");
			exit(1);
		}

		insert(&gFront,p);

		printList();
		scanf("%d",&a);
	}

	printf("入力を終了しました\n");

	return 0;
}

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: セルを挿入する関数の作成

#2

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21424
// セルを挿入する関数の作成 - ミクプラ(ja)
//
// ConsoleApplication1.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//
#define _CRT_SECURE_NO_WARNINGS

#if 0

#include<stdio.h>
#include<stdlib.h>

struct cell {
	int value;			/*このセルが持つデータ*/
	struct cell* next;	/*次のセルを指すポインタ*/
};

/*連結リストの先頭を指すダミーセル,今回はvalueの値を-1にする*/
struct cell gFront = { -1, NULL };

void printList(void) {
	struct cell* p;

	printf("LIST[");

	p = gFront.next;
	while (p != NULL) {
		printf("%d ", (*p).value);
		p = (*p).next;
	}
	printf("]\n");
}

int main(void) {
	int a;
	struct cell* p;

	scanf("%d", &a);
	while (a >= 0) {
		p = (struct cell*)malloc(sizeof(struct cell));
		if (p == NULL) {
			fprintf(stderr, "エラー: malloc失敗\n");
			exit(1);
		}
		(*p).value = a;

		/***********************/
		/*連結リストの先頭に追加する*/
		/**********************/

		/*(1)まず,新しいセルが今の先頭セルを指すようにする*/
		(*p).next = gFront.next;

		/*(2)次に,ダミーセルが新しいセルを指すようにする*/
		gFront.next = p;

		printList();
		scanf("%d", &a);
	}

	printf("入力を終了しました\n");

	return 0;
}

#else

#include<stdio.h>
#include<stdlib.h>

struct cell {
	int value;
	struct cell* next;
};

struct cell gFront = { -1, NULL };

void printList(void) {
	struct cell* p;

	printf("LIST[");

	p = gFront.next;
	while (p != NULL) {
		printf("%d ", p->value );
		p = p->next;
	}
	printf("]\n");
}

/************insert関数*******************/
void insert(struct cell* pre, struct cell* newp ) {
	if (pre == NULL || newp == NULL)
		fprintf(stderr, "insert: 引数 pre または newp がNULLです。\n");

	newp->next = pre->next;
	pre->next = newp;
}

int main(void) {
	int a;
	struct cell* p;

	scanf("%d", &a);
	while (a >= 0) {
		p = (struct cell*)malloc(sizeof(struct cell));
		if (p == NULL) {
			fprintf(stderr, "エラー: malloc失敗\n");
			exit(1);
		}

		p->value = a; // これが抜けていた。

		//insert(&gFront, p);
		insert(&gFront, p);

		printList();
		scanf("%d", &a);
	}

	printf("入力を終了しました\n");

	return 0;
}


#endif
// end.
下のプログラムでは、

p->value = a; // これが抜けていた。

が抜けているみみ。

> -現在の実行-のようにアドレス(?)が出力されてしまいます。

初期化されていない値が出力されていたみみ。
なお、new は、C++ では予約語なので、変数名に使えないので、newp に変更したみみ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

SOLAR
記事: 3
登録日時: 2年前

Re: セルを挿入する関数の作成

#3

投稿記事 by SOLAR » 2年前

返信遅れて申し訳ないです。
無事解決できました!ありがとうございます!

返信

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