报错内容
把s_gets中find=‘\0'改掉后 不去掉换行符 就可以正确进行 留下则报错访问权限冲突 麻烦大家指正!!
list.h
#ifndef LIST_H
#define LIST_H
#include<stdbool.h>
#define TSIZE 45
struct file
{
char title[TSIZE];
int rating;
};
typedef struct file 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 int ListItemCount(const List* plist);
bool AddItem(Item item, List* plist);
void traverse(const List* plist, void(*pfun)(Item item));
void Emptythelist(List* plist);
#endif
film3.c
#include<stdio.h>
#include<stdlib.h>
#include<list.h>
void showmovies(Item item);
char* s_gets(char* st, int n);
//* &movies
int main(void)
{
List movies;
Item temp;
InitializeList(&movies);
if (ListIsFull(&movies))
{
fprintf(stderr, "No memory available,BYe\n");
exit(1);
}
puts("enter first movie title:");
while (s_gets(temp.title, TSIZE) != NULL && temp.title[0] != '\0')
{
puts("enter your rating1-10: ");
scanf_s("%d", &temp.rating);
while (getchar() != '\n')
continue;
if (AddItem(temp, &movies) == false)
{
fprintf(stderr, "problem allocating memory\n");
break;
}
if (ListIsFull(&movies))
{
puts("the list is now full:");
break;
}
puts("enter next movie title,enter line to stop");
}
if (ListIsEmpty(&movies))
{
puts("no data entered");
}
else
{
puts("here is movie list:");
traverse(&movies, showmovies);
}
printf("your enter %d movies\n", ListItemCount(&movies));
Emptythelist(&movies);
printf("Bye\n");
return 0;
}
char* s_gets(char* st, int n)
{
char* ret_val;
char* find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n');
if (find)
{
*find = '\0';
}
else
{
while (getchar() != '\n')
continue;
}
}
return ret_val;
}
void showmovies(Item item)
{
printf("movie: %s and rating: %d ", item.title, item.rating);
}
#include<stdio.h>
#include<stdlib.h>
#include<list.h>
static void copytonode(Item item, Node* pnode);
void InitializeList(List* plist)//(struct node **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 int ListItemCount(const List* plist)
{
unsigned int 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;
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);
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;
}