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;
}

