longdeqidao 发表于 2012-11-11 19:11:57

链表中得段错误 找了很久找不出错误

//main.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

void showmovies(Item item);

int main()
{
    List movies;
    Item temp;

    InitializeList(&movies);

    if(ListIsFull(movies))
    {
      fprintf(stderr, "No memory available! Bye!\n");
      exit(EXIT_SUCCESS);
    }

    puts("Enter first movie title: ");
    while(gets(temp.title) != NULL && temp.title != '\0')
    {
      puts("Enter your rating <0 - 10>: ");
      scanf("%d", &temp.rating);
      while(getchar() != '\n')
            continue;
      if(!AddItem(temp, &movies))
      {
            fprintf(stderr, "Problem allocating memory.\n");
            break;
      }
      if(ListIsFull(movies))
      {
            puts("The list is now full");
            break;
      }
      puts("Enter next movie title (empty title to stop): ");
    }
    if(ListIsEmpty(movies))
      printf("No data entered");
    else
    {
      printf("Here is the movie list: \n");
      Traverse(movies, showmovies);
    }
    printf("You enter %d movies.\n", ListItemCount(movies));
    EmptyTheList(&movies);
    puts("Bye!");

    return 0;
}

void showmovies(Item item)
{
    printf("Movies: %s Rating :%d\n", item.title, item.rating);
}


//list.h
#ifndef LIST_H_
#define LIST_H_

#include <stdbool.h>

#define TSIZE 45
typedef struct film
{
    char title;
    int rating;
}Item;

typedef struct node
{
    Item item;
    struct node *next;
} Node;

typedef Node *List;

void InitializeList(List *plist);
bool ListIsEmpty(const List *plist);
bool ListIsFull(const List *plist);
unsigned ListItemCount(const List *plist);
bool AddItem(Item item, List *plist);
void Traverse(const List *plist, void (*pfun)(Item item));
void EmptyTheList(List *plist);

#endif


list.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

static void CopyToNode(Item item, Node *pnode);

void InitializeList(List *plist)
{
    *plist = NULL;
}

bool ListIsEmpty(const List *plist)
{
    if(*plist == NULL)
      return true;
    else
      return false;
}

bool ListIsFull(const List *plist)
{
    Node *pt;
    bool full;

    pt = (Node *)malloc(sizeof(Node));
    if(pt == NULL)
      full = true;
    else
      full = false;
    free(pt);
    return full;
}

unsigned ListItemCount(const List *plist)
{
    unsigned count = 0;
    Node *pnode = *plist;

    while(pnode != NULL)
    {
      ++count;
      pnode = pnode->next;
    }

    return count;
}

bool AddItem(Item item, List *plist)
{
    Node *pnew;
    Node *scan = *plist;

    pnew = (Node *)malloc(sizeof(Node));
    if(pnew == NULL)
      return false;

    CopyToNode(item, pnew);
    pnew->next = NULL;
    if(scan == NULL)
      *plist = pnew;//无头指针!第一个Node就存有效数据了
    else
    {
      while(scan->next != NULL)
            scan = scan->next;
      scan->next = pnew;
    }
    return true;
}

void Traverse(const List *plist, void (*pfun)(Item item))
{
    Node *pnode = *plist;
    while(pnode != NULL)
    {
      pfun(pnode->item);//经过调试这里使程序崩掉!但是一直找不出错误在哪儿啊是段错误 segmentation fault
      pnode = pnode->next;
    }
}

void EmptyTheList(List *plist)
{
    Node *psave;
    while(*plist != NULL)
    {
      psave = (*plist)->next;
      free(*plist);
      *plist = psave;
    }
}

static void CopyToNode(Item item, Node *pnode)
{
    pnode->item = item;
}
希望大神指点一二这是数据结构的开端。

梦想实践家 发表于 2012-11-11 19:41:21

段错误一般是指针越界了,好好检查下指针

阔怀 发表于 2015-8-27 16:05:52

帮顶
页: [1]
查看完整版本: 链表中得段错误 找了很久找不出错误