使用链表读取数据

/* * 使用链表 * * 动态内存的局限性体现在必须提前知道数据的大小,以便申请相应的动态内存。 * 然而,大部分情况用户都无法事先知道这个值。因而页就无法申请相应的内存空间。 * 对于这种事先未知的数据,可以使用链表将其分块保存。 * 链表是一种动态地进行存储分配的结构。链表中的各个元素是一个结构,每个元素称为 * 链表的一个结点。此结构中包含由一个指向此结构的指针,用于指向链表中的下一个结点。 * 链表的最后一个结点指针是NULL,表示链表结束。 * 例如: * struct strdata{ * char *string; * struct strdata *next; * } * */ #include #include #include #define DATASIZE 10 typedef struct stringdata { char *string; int iscontinuing; struct stringdata *next; }mydata; mydata *append(mydata *start, char *input); void displaydata(mydata *start); void freedata(mydata *start); int main(void){ char input[DATASIZE]; mydata *start=NULL; printf("ENTER SOME DATA AND PRESS Ctrl+D WHEN DONE./n"); while(fgets(input, sizeof(input), stdin)) { start = append(start,input); } /* * 从流中读一行或指定个字符 * char *fgets(char *s,int n, FILE *stream); * 从流中读取n-1个字符,除非读完一行。参数s时用来接收字符串,如果成功则返回s的指针,否则返回NULL。 * */ //displaydata(start); //freedata(start); return 0; } mydata *append(mydata *start, char *input){ mydata *cur=start; //上一个结点 mydata *prev=NULL;//下一个结点 mydata *new;//新结点 while(cur){ prev=cur; cur=cur->next; } cur=prev; new=malloc(sizeof(mydata)); if(!new){ printf("不能分配内存/n"); exit(255); } if(cur) cur->next=new; else start=new; cur=new; if(! (cur->string=malloc(sizeof(input)+1)) ){ printf("不能分配内存/n"); exit(255); } strcpy(cur->string,input); cur->iscontinuing=(input[strlen(input)-1]=='/n' || input[strlen(input)-1]=='/r'); cur->next=NULL; return start; } 

你可能感兴趣的:(C/C++,input,struct,null,string,stream,file)