链表,形参,实参

 在学习C语言的时候,关于形参如何改变实参,链表中节点的值何时被改变,何时不被改变,一直没有搞明白,今天终于搞懂,记录下来备份。 

1、形参改变实参

 

#include <stdio.h>
#include 
<malloc.h>
typedef 
struct LNode
...{
    FILE 
*fp;
    
char *fname;
    
struct LNode *next;
}
LNode;
LNode 
*LinkList;
LNode 
*ListInit(LNode *linklist)...{
    
    
if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
        printf(
"Init Link Error");
        exit(
0);
    }

    linklist
->next=NULL;
    
return linklist;
}

ListInsert(LNode 
*linklist, char *fname,FILE *fp)...{
    LNode 
*lnode;
  LNode 
*p;   
  p
=linklist;
            
if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
                    printf(
"Insert Error");
                    exit(
0);
                }

                
while(p->next!=NULL)...{
                    p
=p->next;                    
                    
if(!strcmp(p->fname,fname))
                        
...{
                            p
->fp=fp;
                            
return ;
                        }

                }

                p
->next=lnode;
                lnode
->fp=fp;
                lnode
->fname=fname;            
                lnode
->next=NULL;
                p
=lnode;
                
                
//注意这一段代码,这里只是改变了test指针指向的所指变量的值,即fname的值,
                
//故,在main函数中的fname的值会发生变化
                while(*fname!='

2、形参不改变实参

 

#include <stdio.h>
#include 
<malloc.h>
typedef 
struct LNode
...{
    FILE 
*fp;
    
char *fname;
    
struct LNode *next;
}
LNode;
LNode 
*LinkList;
LNode 
*ListInit(LNode *linklist)...{
    
    
if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
        printf(
"Init Link Error");
        exit(
0);
    }

    linklist
->next=NULL;
    
return linklist;
}

ListInsert(LNode 
*linklist, char *fname,FILE *fp)...{
    LNode 
*lnode;
  LNode 
*p;   
  p
=linklist;
            
if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
                    printf(
"Insert Error");
                    exit(
0);
                }

                
while(p->next!=NULL)...{
                    p
=p->next;                    
                    
if(!strcmp(p->fname,fname))
                        
...{
                            p
->fp=fp;
                            
return ;
                        }

                }

                p
->next=lnode;
                lnode
->fp=fp;
                lnode
->fname=fname;            
                lnode
->next=NULL;
                p
=lnode;                
                
//注意这一段代码,与前一个TestOne.c不一样,
                
//这里将fname的值变为"TTT"的地址,就是所fname的地址改变了,
                
//但是调用函数不能改变实参指针变量的值,也就是地址,故main函数中的fname的值不会变
            /**//*    while(*fname!='

3、通过改变main函数中的字符串数组的值,来改变链表中对应的值

 

#include <stdio.h>
#include 
<malloc.h>
typedef 
struct LNode
...{
    FILE 
*fp;
    
char *fname;
    
struct LNode *next;
}
LNode;
LNode 
*LinkList;
LNode 
*ListInit(LNode *linklist)...{
    
    
if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
        printf(
"Init Link Error");
        exit(
0);
    }

    linklist
->next=NULL;
    
return linklist;
}

ListInsert(LNode 
*linklist, char *fname,FILE *fp)...{
    LNode 
*lnode;
  LNode 
*p;   
  p
=linklist;
            
if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
                    printf(
"Insert Error");
                    exit(
0);
                }

                
while(p->next!=NULL)...{
                    p
=p->next;                    
                    
if(!strcmp(p->fname,fname))
                        
...{
                            p
->fp=fp;
                            
return ;
                        }

                }

                p
->next=lnode;
                lnode
->fp=fp;        
                lnode
->fname=fname;
                printf(
"...........after lnode->fname=%s ",lnode->fname);
                lnode
->next=NULL;
                p
=lnode;        
    LinkList 
= linklist;
}

FILE 
*openFile(char *fname)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值