リスト・双方向リストについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hunter

リスト・双方向リストについて

#1

投稿記事 by hunter » 13年前

初めてここを利用させていただきます。以下のようなプログラムを作りたいのですが勉強不足のためうまくいきません。
ご指導お願いします。

1、入力された文字をリストを用いて順次格納し,’-’が入力された後,次に入力された文字を持つ要素をリスト
から削除し,最後にリスト中の全て文字を出力するようなプログラム.

2、入力された整数を双方向リストを用いて順次格納する.0 が入力された時に整数の入力
を終了し,それまでに格納された全ての整数を表示するプログラム.表示は順方向,逆方向ともに行うこと.

自分で作ったソースファイル

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

typedef struct node {
char moji;
struct node *next;
int data;
} NODE;

NODE head;

int main(){
char n;
int data;
NODE *cur;
NODE *new;
NODE *pev;

head.next = NULL;
cur = head.next;
pev = &head;

do{
scanf("%c",&n);
if(n=='-') continue;
new = (NODE*)malloc(sizeof(NODE));
if(new==NULL){
printf("malloc error\n");
return 0;
}
new->moji = n;
new->next = head.next;
head.next = new;
} while(n!='-');

scanf("%d", &data); getchar();

while( cur != NULL ){
if( cur-> data != data)
{
pev = cur;
cur = cur->next;
}
pev->next = cur->next;
free( cur );
}

while(cur!=NULL){
printf("[%c]", cur->moji);
cur = cur->next;
} printf("\n");
return 0;
}

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

struct LIST
{
int data;
struct LIST* next;
struct LIST* prev;
};
struct LIST head;

int main(void)
{
struct LIST* p, *newcell;
int data;

puts( "追加する要素の値を入力して下さい" );
scanf( "%d", &data );

p = head.next;
if( p != NULL )
{
while( p != &head )
{
p = p->next;
}
}

newcell = malloc( sizeof(struct LIST) );
if( newcell == NULL )
{
puts( "メモリ不足" );
return;
}

if( data != 0)
newcell->data = data;
newcell->next = p->next;
newcell->prev = p;
p->next->prev = newcell;
p->next = newcell;


struct LIST *p;

for( p=head.next; p!=&head; p=p->next )
{
printf( "%d\n", p->data );
}
}

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: リスト・双方向リストについて

#2

投稿記事 by へろりくしょん » 13年前

ソースコードを張る場合は、code タグを利用される事を強く切望します。
それと、どう上手く行かないのかを書いた頂けると、大変助かります。

それなりに行数があり、インデントも崩れてるとなると処理を追うのも一苦労です。
また、具体的な問題点が明示されない場合、いちいちどこが問題なのかを探す事になりますが、上記の理由によりその困難さに拍車をかけます。

最終的には、こちらで IDE を起動し、コードを整形した上にデバッガを駆使することになりますが、それは大変手間で面倒な事です。

non
記事: 1097
登録日時: 14年前

Re: リスト・双方向リストについて

#3

投稿記事 by non » 13年前

2つの課題があるようなので、とりあえず最初のから
見にくいにので、貼り直しました

コード:

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

typedef struct node {
	char moji;
	struct node *next;
	int data;
} NODE;

NODE head;

int main(){
	char n; 
	int data;
	NODE *cur;
	NODE *new;
	NODE *pev;

	head.next = NULL;
	cur = head.next;
	pev = &head;

	do{
		scanf("%c",&n); 
		if(n=='-') continue;
		new = (NODE*)malloc(sizeof(NODE));
		if(new==NULL){
			printf("malloc error\n");
			return 0;
		}
		new->moji = n;
		new->next = head.next;
		head.next = new;
	} while(n!='-');

	scanf("%d", &data); getchar();

	while( cur != NULL ){
		if( cur-> data != data)
		{
			pev = cur;
			cur = cur->next;
		}
		pev->next = cur->next;
		free( cur );
	} 

	while(cur!=NULL){
		printf("[%c]", cur->moji);
		cur = cur->next;
	} printf("\n");
	return 0;
}

どのように入力するのでしょうか?
例えば
abcdef-d
のようにでしょうか?
だとすると、36行目は何を入力していますか?

20行目でcur = head.next;をしていますが、このタイミングではNULLが入りますので、38行のwhileの中は行われません。

newという変数名は、紛らわしいのでできれば使って欲しくない。
newPとか別の名前にして欲しい。
non

閉鎖

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