结构链接列表分段 - 故障

时间:2012-09-30 23:13:51

标签: c pointers segmentation-fault structure

我刚开始在我的实验室开始,在那里我计算了其信息存储在结构链表中的课程的GPA。截至目前,我正在尝试打印出所有课程信息,以确保它们已正确初始化并添加到链接列表中。

我遇到了问题,因为我一直遇到分段错误。我理解Segmentation Fault意味着什么,但我不知道我在哪里弄错了。任何帮助,将不胜感激。

#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);



}

2 个答案:

答案 0 :(得分:2)

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

插入第一个节点时(end时)需要将new设置为head == NULL,否则在添加更多节点时会取消引用空指针。

initcourse中,您应该将next成员设置为NULL,因为标准不保证all-bits-0是空指针表示( 非常可能是,但不能保证。)

此外,

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

声明一个新的局部变量head,它会影响全局变量,而不是直接分配给head(即使它是错误的),你应该调用add(ptr);

答案 1 :(得分:0)

你没有初始化next指针,所以最后一个元素包含一个坏指针,指向一些垃圾。

您也不会初始化end

另一个问题(与崩溃无关)是此代码将创建一个重复的条目:

head = ptr;
add(ptr);

还有其他问题。你真的应该得到一个调试器,看看发生了什么。