質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

オーバーフローします...

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 942

RYUi

score 8

前提・実現したいこと

アルファベット順に表示したいです
どうやったらアルファベット順に表示できますか?
もし,このままでいいならオーバーフローを直して欲しいです...
アルファベット順に表示させる機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ
Abort trap: 6

該当のソースコード

c言語
ここにご自身が実行したソースコードを書いてください
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


struct data{
  char name[256];
  char mail[256];
  int group;
  int ID;
  struct data *next;
};

void alphabet_output(struct data *p1);
struct data* new_data(struct data* list);
void list_output(struct data* p);

int main(void){


  struct data *list = NULL;
  int i=1;

  while(i){
    list = new_data(list);
    scanf("%d",&i);
  }

  alphabet_output(list);
  //list_output(list);                                                                                             
}

void alphabet_output(struct data *p1){    //アルファベット順に表示//                                               

  struct data *p2;  //交換するために使う//                                                                          
  struct data *p3;    //それぞれの比較でアルファベット順で一番早い人を格納しておく                                 
  struct data *p4;     //一番初めを格納                                                                             
  struct data *p5;   //比較する対象                                                                                

  p2=(struct data*)malloc(sizeof(struct data));
  p3=(struct data*)malloc(sizeof(struct data));
  p5=(struct data*)malloc(sizeof(struct data));
  if(p1->next==NULL){
    printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
  }
  else{
    p4=p1;
    while(p1->next!=NULL){

      p3=p1;
      p5=p1;

      while(1){
        if(p5->next==NULL){
          break;
        }


        if(strcmp(p3->name,p5->name)==0){

        }
        else if(strcmp(p3->name,p5->name)>0){

          p3=p5;

        }
        else if(strcmp(p3->name,p5->name)<0){

    }
       p5 = p5->next;

      }
      strcpy(p2->name,p1->name);
      strcpy(p2->mail,p1->mail);
      p2->group=p1->group;
      p2->ID=p1->ID;


      strcpy(p1->name,p3->name);
      strcpy(p1->mail,p3->mail);
      p1->group=p3->group;
      p1->ID=p3->ID;

      strcpy(p3->name,p2->name);
      strcpy(p3->mail,p2->mail);
      p3->group=p2->group;
      p3->ID=p2->ID;
     p5=p1->next;
      p1=p1->next;
    }

    p1=p4;
    while(p1->next!=NULL){
      printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
      p1=p1->next;
    }
    printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
  }
}

struct data* new_data(struct data* list){
  char check[256];
  int a,b=0;

  struct data* node = (struct data*)malloc(sizeof(struct data));
  printf("データを入力してください。\n");
  printf("name:");
  scanf("%s",node->name);
  printf("mail:");
 scanf("%s",node->mail);

  while(b!=1){
    printf("group:");
    scanf("%s",check);
    a=0;
    b=1;
    while(check[a]!='\0'&& check[a] != '\n'){
      if(check[a]<'0' || '9'<check[a]){
        b=0;
        printf("数字を入力してください。\n");break;
      }
      a++;
    }
    node->group = atoi(check);

  }
  node->next = NULL;

  if(list == NULL){ node->ID = 1;

    return node;//空なら、ここに入る                                                                               
  }
  else{
    struct data* p = list; int n = 2;
    p->ID = 1;
    while (p->next != NULL) {//最後までいく                                                                        
      p->next->ID = n;
      n++;
      p = p->next;
    }
    node->ID = n;
    p->next = node;
    //最後のとこにれんけつする                                                                                     \

    return list;
  }
}

void list_output(struct data *p){
  int total=0;
  while(p!=NULL){

    printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID);
    total++;
    if(p->next == NULL)
    break;
    p=p->next;

  }
  printf("登録者数は%dです\n",total);

}

試したこと

ネットで確認するとオーバーフローとはわかったのですがその後どうソースコードを直せばいいのかわからなかったです.

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

少し修正しましたが、オーバーフローを起こせませんでした?

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

struct data{
  char name[256];
  char mail[256];
  int group;
  int ID;
  struct data *next;
};

void alphabet_output(struct data *p1);
struct data* new_data(struct data* list);
void list_output(struct data* p);

int main(void){


  struct data *list = NULL;
  int i=1;

  while(i){
    list = new_data(list);
    scanf("%d",&i);
  }

  alphabet_output(list);
  list_output(list);
  return 0;
}

void alphabet_output(struct data *p1){    //アルファベット順に表示//

  struct data *p2;   //交換するために使う//
  struct data *p3;   //それぞれの比較でアルファベット順で一番早い人を格納しておく
  struct data *p4;   //一番初めを格納
  struct data *p5;   //比較する対象

  p2=(struct data*)malloc(sizeof(struct data));
  p3=(struct data*)malloc(sizeof(struct data));
  p5=(struct data*)malloc(sizeof(struct data));
  if(p1->next==NULL){
    printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
  }
  else{
    p4=p1;
    while(p1->next!=NULL){

      p3=p1;
      p5=p1;

      while(1){

        if(strcmp(p3->name,p5->name)==0){
        }
        else if(strcmp(p3->name,p5->name)>0){
             p3=p5;
        }
        else if(strcmp(p3->name,p5->name)<0){
        }

        if(p5->next==NULL){
          break;
        }
        p5 = p5->next;
      }

      strcpy(p2->name,p1->name);
      strcpy(p2->mail,p1->mail);
      p2->group=p1->group;
      p2->ID=p1->ID;

      strcpy(p1->name,p3->name);
      strcpy(p1->mail,p3->mail);
      p1->group=p3->group;
      p1->ID=p3->ID;

      strcpy(p3->name,p2->name);
      strcpy(p3->mail,p2->mail);
      p3->group=p2->group;
      p3->ID=p2->ID;
      //p5=p1->next;

      p1=p1->next;
    }

    p1=p4;
    while(p1->next!=NULL){
      printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
      p1=p1->next;
    }
    printf("%s %s %d %d\n",p1->name,p1->mail,p1->group,p1->ID);
  }
}

struct data* new_data(struct data* list){
  char check[256];
  int a,b=0;

  struct data* node = (struct data*)malloc(sizeof(struct data));
  printf("データを入力してください。\n");
  printf("name:");
  scanf("%s",node->name);
  printf("mail:");
  scanf("%s",node->mail);

  while(b!=1){
    printf("group:");
    scanf("%s",check);
    a=0;
    b=1;
    while(check[a]!='\0'&& check[a] != '\n'){
      if(check[a]<'0' || '9'<check[a]){
        b=0;
        printf("数字を入力してください。\n");break;
      }
      a++;
    }
  }
  node->group = atoi(check);
  node->next = NULL;

  if(list == NULL){
        node->ID = 1;
    return node;//空なら、ここに入る
  }
  else{
    struct data* p = list;
    int n = 2;
    p->ID = 1;
    while (p->next != NULL) {//最後までいく
      p->next->ID = n;
      n++;
      p = p->next;
    }
    node->ID = n;
    p->next = node;
    //最後のとこにれんけつする
    return list;
  }
}

void list_output(struct data *p){
  int total=0;
  while(p!=NULL){

    printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID);
    total++;
    if(p->next == NULL)
    break;
    p=p->next;

  }
  printf("登録者数は%dです\n",total);
}

ポインタの連結をソート版も作成してみました。

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

struct data{
  char name[256];
  char mail[256];
  int group;
  int ID;
  struct data *next;
};

struct data* new_data(struct data* list, int n);
void list_output(struct data* p);

int main(void){

  struct data *list = NULL;
  int i=1;
  int n=1;

  while(i){
    list = new_data(list, n++);
    scanf("%d",&i);
  }

  list_output(list);
  return 0;
}

struct data* new_data(struct data* list, int n){
  char check[256];
  int a,b=0;

  struct data* node = (struct data*)malloc(sizeof(struct data));
  printf("データを入力してください。\n");
  printf("name:");
  scanf("%s",node->name);
  printf("mail:");
  scanf("%s",node->mail);

  while(b!=1){
    printf("group:");
    scanf("%s",check);
    a=0;
    b=1;
    while(check[a]!='\0'&& check[a] != '\n'){
      if(check[a]<'0' || '9'<check[a]){
        b=0;
        printf("数字を入力してください。\n");break;
      }
      a++;
    }
  }
  node->group = atoi(check);
  node->ID = n;
  node->next = NULL;

  if(list == NULL){
    list = node;
  }
  else{
    struct data* p = list;
    struct data* r = list;
    while (1){
      if(strcmp(p->name,node->name)>0){
        node->next=p;
        if(r==list){
           list=node;
        }else{
           r->next=node;
        }
        break;
      }
      if (p->next==NULL){
          p->next=node;
          break;
      }
      r = p;
      p = p->next;
    }
  }
  return list;
}

void list_output(struct data *p){
  int total=0;
  while(p!=NULL){

    printf("%s %s %d %d\n",p->name,p->mail,p->group,p->ID);
    total++;
    if(p->next == NULL)
    break;
    p=p->next;

  }
  printf("登録者数は%dです\n",total);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/22 14:06

    オーバーフローしなくなりました!!ありがとうございました!!

    キャンセル

0

もし,このままでいいならオーバーフローを直して欲しいです... 

メモリリークを起こすコードがある。
ソートもこれじゃできない。
エラー情報も少なすぎ。
もうちょっと自分で一度がんばりなさい。

何が正しいか自分で判断できる部分はあるはずです。
それを頭から見直していき、「おかしい」と思う部分がなくなるまでコードを整理してください。

で、解決できない「おかしい」が出たら質問しましょう。
正しいものと間違っているものが自分でわからないまま質問するのは今後のためによくありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

この課題は、リスト構造のデータのソートで、ポインタの付け替えでできるってことを学ぶものだと思います。今の不具合がとれデータをコピーする方法で解決してたとしても、評価は低いと思われます。

それを踏まえてもう一度、考えてみてはどうでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる