ページ 1 / 1
リスト構造に関しての質問
Posted: 2013年7月01日(月) 19:45
by 学生
リスト構造のプログラムに関しての質問です。
リストを二つ作った後に、scanfで値を入力しようとすると、入力直後にセグメンテーション違反になります。
以下がソースです(ファイルを二つ読み込んでます)
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node *next;
}NODE;
NODE *newNODE(){
NODE *newNode;
newNode=(NODE*)malloc(sizeof(NODE));
if(newNode==NULL){
printf("memory cannot alloc!¥n");
free(newNode);
}
return newNode;
}
main(){
NODE *p,*m;
int i,N=0;
FILE *fp;
char file_name1[]="data1.txt";
fp=fopen(file_name1,"r");
if(fp==NULL){
printf("File open error¥n");
return 1;
}
p=newNODE();
m=p;
while(fscanf(fp,"%d",&p->num)!=EOF){
p->next=newNODE();
p=(p->next);
N++;
}
fclose(fp);
p=NULL;
for(i=0;i<N;i++){
if(m!=NULL){
printf("%d ",m->num);
m=m->next;
}
}
printf("\n");
NODE *l,*n;
int o,M=0;
FILE *fp1;
char file_name2[]="data2.txt";
fp1=fopen(file_name2,"r");
if(fp1==NULL){
printf("File open error\n");
return 1;
}
l=newNODE();
n=l;
while(fscanf(fp1,"%d",&l->num)!=EOF){
l->next=newNODE();
l=(l->next);
M++;
}
fclose(fp1);
l=NULL;
for(o=0;o<M;o++){
if(n!=NULL){
printf("%d ",n->num);
n=n->next;
}
}
printf("\n");
int a1,r1;
printf("please input the number of list be inputted\n");
scanf("%d",&a1);
printf("%d",a1);
l=NULL;
for(r1=0;r1<a1;r1++){
n=n->next;
}
printf("%d ",n->num);
return 0;
}
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 19:46
by Rittai_3D
とりあえず、コードタグでくくってください。読みづらいです。
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 19:57
by 学生
すみません、フォーラム確認を怠りました……
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node *next;
}NODE;
NODE *newNODE(){
NODE *newNode;
newNode=(NODE*)malloc(sizeof(NODE));
if(newNode==NULL){
printf("memory cannot alloc!¥n");
free(newNode);
}
return newNode;
}
main(){
NODE *p,*m;
int i,N=0;
FILE *fp;
char file_name1[]="data1.txt";
fp=fopen(file_name1,"r");
if(fp==NULL){
printf("File open error¥n");
return 1;
}
p=newNODE();
m=p;
while(fscanf(fp,"%d",&p->num)!=EOF){
p->next=newNODE();
p=(p->next);
N++;
}
fclose(fp);
p=NULL;
for(i=0;i<N;i++){
if(m!=NULL){
printf("%d ",m->num);
m=m->next;
}
}
printf("\n");
NODE *l,*n;
int o,M=0;
FILE *fp1;
char file_name2[]="data2.txt";
fp1=fopen(file_name2,"r");
if(fp1==NULL){
printf("File open error\n");
return 1;
}
l=newNODE();
n=l;
while(fscanf(fp1,"%d",&l->num)!=EOF){
l->next=newNODE();
l=(l->next);
M++;
}
fclose(fp1);
l=NULL;
for(o=0;o<M;o++){
if(n!=NULL){
printf("%d ",n->num);
n=n->next;
}
}
printf("\n");
int a1,r1;
printf("please input the number of list be inputted\n");
scanf("%d",&a1);
printf("%d",a1);
l=NULL;
for(r1=0;r1<a1;r1++){
n=n->next;
}
printf("%d ",n->num);
return 0;
}
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 20:00
by 学生
再度失礼します
コード:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node *next;
}NODE;
NODE *newNODE(){
NODE *newNode;
newNode=(NODE*)malloc(sizeof(NODE));
if(newNode==NULL){
printf("memory cannot alloc!¥n");
free(newNode);
}
return newNode;
}
main(){
NODE *p,*m;
int i,N=0;
FILE *fp;
char file_name1[]="data1.txt";
fp=fopen(file_name1,"r");
if(fp==NULL){
printf("File open error¥n");
return 1;
}
p=newNODE();
m=p;
while(fscanf(fp,"%d",&p->num)!=EOF){
p->next=newNODE();
p=(p->next);
N++;
}
fclose(fp);
p=NULL;
for(i=0;i<N;i++){
if(m!=NULL){
printf("%d ",m->num);
m=m->next;
}
}
printf("\n");
NODE *l,*n;
int o,M=0;
FILE *fp1;
char file_name2[]="data2.txt";
fp1=fopen(file_name2,"r");
if(fp1==NULL){
printf("File open error\n");
return 1;
}
l=newNODE();
n=l;
while(fscanf(fp1,"%d",&l->num)!=EOF){
l->next=newNODE();
l=(l->next);
M++;
}
fclose(fp1);
l=NULL;
for(o=0;o<M;o++){
if(n!=NULL){
printf("%d ",n->num);
n=n->next;
}
}
printf("\n");
int a1,r1;
printf("please input the number of list be inputted\n");
scanf("%d",&a1);
printf("%d",a1);
l=NULL;
for(r1=0;r1<a1;r1++){
n=n->next;
}
printf("%d ",n->num);
return 0;
}
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 20:13
by non
何をしたいプログラムなんでしょうか?
特に70行以降では、何をしたいのですか?
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 20:22
by 学生
リストを二つ(mとn)作った後に、70桁以降で、キーボードから指定したリストの数を添字の様に使って、リストnの途中に、リストmを挿入する動作を実現させたいです……
例えば、n(a)(n(5))→n(b)(n(n6))であるようなときに、n(a)(m(0))→ m(a')(m(1))→.........→m(c')(n(5)) →n(b)(n(6))、と言った具合です。
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 20:30
by 学生
失礼しました
正しくは以下になります
n(a)(n(5))→n(b)(n(6))であるようなときに、n(a)(m(0))→ m(a')(m(1))→.........→m(c')(n(5)) →n(b)(n(6))
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 20:38
by non
学生 さんが書きました:リストを二つ(mとn)作った後に、70桁以降で、キーボードから指定したリストの数を添字の様に使って、リストnの途中に、リストmを挿入する動作を実現させたいです……
例えば、n(a)(n(5))→n(b)(n(n6))であるようなときに、n(a)(m(0))→ m(a')(m(1))→.........→m(c')(n(5)) →n(b)(n(6))、と言った具合です。
例えば以降は、全くわからないけど、リストの途中にもう一つのリストを挿入したいというのはわかりました。
すると、72行で入力するa1は挿入したい場所をnumから探したいということなのでしょうか?
でも、現在のところ探そうとしているプログラムは、まったくない。
それ以前として、二つ作ったリストの最後尾のnextが初期化されていない(NULLが入っていない)ことが、ものすごく
気になります。現状で、実行エラーになっている原因も、最後尾からn=n->next;しているからです。
mallocできなかったときにfreeしているのも気持ち悪いです。
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 21:18
by 学生
回答ありがとうございます
実現したい動作は、
a1を4だとした場合、n=n->nextを3回実行して、その時のn->nextにmのアドレスを代入、mをm->next==NULLになるまでm=m->nextを実行して、さらにn=n->nextを1回実行し、その時のm->nextにnのアドレスを代入する、という動作です。
自分ではこれをすることで、リストを挿入、連結出来ると思っているのですが、違った動作になるのでしょうか?
ご指摘していただいたところを書き直して見ましたが、やはりセグメンテーション違反になり、上手く行きません。
コード:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node *next;
}NODE;
NODE *newNODE(){
NODE *newNode;
newNode=(NODE*)malloc(sizeof(NODE));
if(newNode==NULL){
printf("memory cannot alloc!\n");
}
return newNode;
}
main(){
NODE *p,*m;
int i,N=0;
FILE *fp;
char file_name1[]="data1.txt";
fp=fopen(file_name1,"r");
if(fp==NULL){
printf("File open error\n");
return 1;
}
p=newNODE();
m=p;
while(fscanf(fp,"%d",&p->num)!=EOF){
p->next=newNODE();
p=(p->next);
N++;
}
p->next=NULL;
fclose(fp);
p=NULL;
for(i=0;i<N;i++){
if(m!=NULL){
printf("%d ",m->num);
m=m->next;
}
}
printf("\n");
NODE *l,*n;
int o,M=0;
FILE *fp1;
char file_name2[]="data2.txt";
fp1=fopen(file_name2,"r");
if(fp1==NULL){
printf("File open error\n");
return 1;
}
l=newNODE();
n=l;
while(fscanf(fp1,"%d",&l->num)!=EOF){
l->next=newNODE();
l=(l->next);
M++;
}
l->next=NULL;
fclose(fp1);
l=NULL;
for(o=0;o<M;o++){
if(n!=NULL){
printf("%d ",n->num);
n=n->next;
}
}
printf("\n");
int a1,r1;
printf("please input the number of list be inputted\n");
scanf("%d",&a1);
printf("%d",a1);
for(r1=0;r1<a1-1;r1++){
n=n->next;
}
printf("%d ",n->num);
n->next=m;
while(1){
if(m->next=NULL){
break;
}
m=m->next;
}
n=n->next;
m->next=n;
return 0;
}
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 21:34
by non
74行目でnはどこを指していますか?
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 21:44
by 学生
上でprintfで表示させた後なので、NULLが入ってるということでしたか。リストの一番初めに戻して無い、ということでしょうか?
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 22:17
by non
そうだと思いますよ。
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 22:25
by 学生
回答ありがとうございます。これで解決出来そうです。
もう一つポインタを宣言して、それにmを代入して、先導からもう一回実行させてみます。
長々と初歩的な質問ばかりですみませんでした。
non様、3D_3D様、ありがとうございました!
Re: リスト構造に関しての質問
Posted: 2013年7月01日(月) 22:34
by non
完成したら、プログラムを載せてください。
できれば、関数化することを考えてください。
また、変数名をもう少しわかりやすいものに変えてください。