пишу процедуры для работы со списками (по Кернигану)
Почему при запсуке программы ошибки иполнения ?
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct nameval nameval; struct nameval { char *name; int value; nameval *next; }; // init nameval *newitem(char *name, int value) { nameval *newp; newp = (nameval *) malloc (sizeof(nameval)); newp->name = name; newp->value = value; newp->next = NULL; return newp; } //add new elem tofirst nameval *addfront (nameval *listp, nameval *newp) { newp->next=listp; return newp; } //add new elem to end nameval *addend (nameval *listp, nameval *newp) { nameval *p; if (listp == NULL) return newp; for (p=listp; p->next != NULL; p= p->next) ; p-> next = newp; return listp; } // search elem nameval *searchelem (nameval *listp, char *name) { for (; listp != NULL; listp = listp->next) { if (strcmp(name,listp->name) ==0) return listp; } return NULL; } // free mem void freeall (nameval *listp) { nameval *next; for (; listp != NULL; listp = next) { next = listp->next; free(listp); } } //delete elem nameval *delitem (nameval *listp, char *name) { nameval *p, *prev; prev = NULL; for (p = listp; p != NULL; p = p->next) { if (strcmp(name, p->name) == 0 ) { if (prev == NULL) listp = p->next; else prev->next = p->next; free(p); return listp; } prev=p; } // not in list return NULL; } // // print int printlist (nameval *listp) { for (; listp != NULL; listp = listp->next) { //printf(listp->name); } return 0; } int main (){ char *s=(char*)malloc (255 *sizeof(char)); nameval *list; scanf ("%s",s); //printf(s); //list = newitem("sdfsdf",0x263A); //list = addfront(list,newitem("sdfsdf",0x263A)); list = addfront(list,newitem(s,0)); list = addfront(list,newitem(s,0)); // list = addfront(list,newitem(s,0)); //printlist(list); freeall(list); }
?
Особо замечу, что все процедуры я взял из книги "Практика программирования" (Брайн Керниган и Роб Пайк).
Разве подобное можно встретить в Паскале ?