0

私は自分の研究室を始めたばかりで、リンクされた構造のリストに情報が格納されているコースの GPA を計算しています。今のところ、すべてのコース情報を印刷して、それらが適切に初期化され、リンク リストに追加されていることを確認しようとしています。

ただし、セグメンテーション違反が発生し続けるため、問題が発生しています。セグメンテーション違反の意味は理解していますが、どこで間違いを犯しているのかわかりません。どんな助けでも大歓迎です。

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

#define MAX_CLASSES 20


/* Function Prototypes */
struct course * initcourse( int, char *, char *, float, char *, char *);
void add( struct course * );

/* Definition of a data node holding course information */
  struct course {
    int term;
    char name[15];
    char abbrev[20];
    float hours;
    char grade [4];
    char type[12];
    struct course *next;
  };


/* head points to first node in list, end points to last node in list */
/* initializes both to NULL, no nodes yet */
struct course *head = (struct course *) NULL;
struct course *end = (struct course *) NULL;


/* Initializes a node, allocates memory for the node, and returns     */
/* a pointer to the new node. Must pass correct parameters.           */
struct course * initcourse( int term, char *name, char *abbrev, float hours, char *grade, char *type)
{
  struct course *ptr;
  ptr = (struct course *) calloc( 1, sizeof(struct course ) );
  if( ptr == NULL )

    return (struct course *) NULL;

  else
    {
      ptr->term = term;
      strcpy( ptr->name, name );
      strcpy( ptr->abbrev, abbrev );
      ptr->hours = hours;
      strcpy( ptr->grade, grade );
      strcpy( ptr->type, type );
      return ptr;
    }
}


/* This adds a node to the end of the list. You must allocate a node and */
/* then pass its address to this function                                */ 
void add(struct course *new)
{
  if (head == NULL)
    {
      head = new;
    }
  else
    {
      end->next = new;
      end = new;
    }
}

/* Prints all information in a node */
void printnode( struct course *ptr )
{
  printf("Term ->%d\n", ptr->term );
  printf("Name ->%s\n", ptr->name );
  printf("Abbreviation ->%s\n", ptr->abbrev );
  printf("Hours ->%f\n", ptr->hours );
  printf("Grade ->%s\n", ptr->grade );
  printf("Type ->%s\n", ptr->type );
}




/* Prints List of Nodes */
void printlist( struct course *ptr ) 
{ 
  while( ptr != NULL ) 
    { 
      printnode( ptr ); 
      ptr = ptr->next;  
    } 
} 

/* Calculates GPA */
/* float gpa ( struct course *ptr ) */
/* { */
/*   float totalhours; */
/*   float gpa; */
/*   float gradepoints; */

/*   while (ptr != NULL ) */
/*     { */
/*       totalhours += (ptr->hours); */
/*       gradepoints = (ptr->hours * ptr->grade); */
/*     } */
/*   gpa = (gradepoints /ptr->hours); */
/* } */



int main()
{

  int term;
  char name[15];
  char abbrev[20];
  float hours;
  char grade[4];
  char type[12];
  float gpa;
  struct course *ptr;

  struct course course1, course2, course3;

  course1.term = 1234;
  strcpy(course1.name,"cse1234");
  strcpy(course1.abbrev,"systems");
  course1.hours = 4;
  strcpy(course1.grade,"A");
  strcpy(course1.type,"GEC");


  ptr = initcourse(course1.term, course1.name, course1.abbrev, course1.hours, course1.grade, course1.type);

  struct course *head, *ptr2;
  head = ptr;
  // ptr2 = ptr;

  add(ptr);

  course2.term = 4332;
  strcpy(course2.name,"cse4332");
  strcpy(course2.abbrev,"Database");
  course2.hours = 4;
  strcpy(course2.grade,"B");
  strcpy(course2.type,"Technical");

  ptr2 =  initcourse(course2.term, course2.name, course2.abbrev, course2.hours, course2.grade, course2.type);

  add(ptr2);

  printlist(head);



}
4

2 に答える 2

2
void add(struct course *new)
{
  if (head == NULL)
    {
      head = new;
    }
  else
    {
      end->next = new;
      end = new;
    }
}

最初のノードを挿入するとき ( のとき) に設定endする必要があります。そうしないと、さらにノードを追加するときに null ポインターを逆参照します。newhead == NULL

また、では、メンバをinitcourseに設定する必要があります。これは、all-bits-0 が null ポインタ表現であることは標準では保証されていないためです (そうなる可能性は非常に高いですが、保証はありません)。nextNULL

また、

struct course *head, *ptr2;
head = ptr;

グローバル変数をシャドウする新しいローカル変数を宣言し、head直接代入する代わりにhead(間違った変数であっても) を呼び出す必要がありますadd(ptr);

于 2012-09-30T23:17:57.410 に答える
0

ポインターを初期化しnextないため、最後の要素には不良ポインターが含まれており、ゴミを指しています。

また、初期化もしませんend

別の問題 (クラッシュとは関係ありません) は、このコードが重複したエントリを作成することです。

head = ptr;
add(ptr);

他にも問題があります。本当にデバッガーを入手して、何が起こっているかを確認する必要があります。

于 2012-09-30T23:18:03.540 に答える