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;
}
全部评论
malloc 的地址不是连续的
点赞 回复 分享
发布于 2021-09-10 11:01

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务