void Print(List L)函数中三种指针使用方法为什么效果不一样?
简单错误记录
http://www.nowcoder.com/questionTerminal/2baa6aba39214d6ea91a2e03dff3fbeb
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Node* ptrToNode; struct Node{ char fileName[17]; int row; int count; ptrToNode Next; }; typedef struct Node* List; List creatList() { List p=(List)malloc(sizeof(struct Node)); p->Next=NULL; p->count=0; return p; } void stdFileName(char s[]) { char *p=strrchr(s,'\\'); p+=1; char s1[17]=""; int n=strlen(p); if(n>16){ strcpy(s1,p+n-16); }else{ strcpy(s1,p); } strcpy(s,s1); } ptrToNode Find(char s[],int row,List L) { ptrToNode p=L->Next; for(;p;p=p->Next){ if(row==p->row&&(strcmp(s,p->fileName)==0)){ p->count++; break; } } return p; } ptrToNode creatNode(char s[],int row,List L) { ptrToNode p=(ptrToNode)malloc(sizeof(struct Node)); strcpy(p->fileName,s); p->row=row; p->count=1; p->Next=NULL; L->count++; return p; } void InsertTail(ptrToNode Tnode,List L) { ptrToNode p=L; for(;p->Next;p=p->Next); p->Next=Tnode; } void Print(List L) { int cnt=L->count; cnt=((cnt>8)?(cnt-8):0); ptrToNode p=L->Next; //第一种方案(通过) { int i; for(i=0;i<cnt;i++,p=p->Next); } //第二种方案(不通过) { // p+=cnt; } //第三种方案(不通过) { //p=&p[cnt]; } for(;p;p=p->Next){ printf("%s %d %d\n",p->fileName,p->row,p->count); } } void Free(List L) { ptrToNode p=L->Next; ptrToNode q=L; for(;p;q=p,p=p->Next){ free(q); } free(q); } int main() { char s[1000]; int row; //创建链表 List L=creatList(); while(scanf("%s %d",s,&row)!=EOF){ //处理输入的文件名,转成标准格式 stdFileName(s); //在链表中查找,找到直接累加次数 ptrToNode address=Find(s,row,L); //找不到创建新节点 if(address==NULL){ ptrToNode Tnode=NULL; Tnode=creatNode(s,row,L); //加到链尾 InsertTail(Tnode,L); } strcpy(s,"\0"); } //打印最后八个 Print(L); //释放链表 Free(L); return 0; }