| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1193 人关注过本帖
标题:单链表的新建,插入问题...
只看楼主 加入收藏
欧罗
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-18
收藏
 问题点数:0 回复次数:10 
单链表的新建,插入问题...

不清楚什么时候用指针建立,比如下面的NODE *create(), void insert()
不知哪位大侠可以细讲一下,谢谢呀!
#include "stdio.h"
typedef struct node
{
int data;
struct node *next;
}NODE;
NODE *create() //新建单链表
{
NODE *head,*q,*p;
char ch;
head=(NODE *)malloc(sizeof(NODE));
q=head;
scanf("%d",&a);
while(ch!='?')
{

p=(NODE *)malloc(sizeof(NODE));
p->data=a;
q->next=p;
q=p;
ch=gerchar();
scanf("%d",&a);
}
q->next=NULL;
return(head);
}
main()
{
int i;
NODE *a;
a=create();
a=a->next;
while(a!=NULL)
{
printf('%d',a->data);
a=a->next;
}
}
void insert(NODE *head,NODE *p,int x) //插入
{
NODE *q;
q=(NODE *)malloc(sizeof(NODE ));
q->data=x;
if(head==NULL)
{
head=q;
q->next=NULL;
}
else
{
q->next=p->next;
p->next=q;
}

}

搜索更多相关主题的帖子: 单链 
2006-05-25 09:52
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
晚上,白天没空,太忙了

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-25 11:09
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用欧罗在2006-5-25 9:52:00的发言:

不清楚什么时候用指针建立,比如下面的NODE *create(), void insert()
不知哪位大侠可以细讲一下,谢谢呀!

这个要看情况而定,你认为调用的时候什么什么方便就用什么
原来“论坛”是个小色狼啊


2006-05-25 12:10
coolg
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-5-21
收藏
得分:0 

不是的啊,端正一点态度就行的啊 ......大家都是朋友的啊


2006-05-25 13:49
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
咳呀,开个玩笑,何必当真!

2006-05-25 13:56
欧罗
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-18
收藏
得分:0 

还等着大侠的指教呢?


2006-05-27 12:18
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
上面说了呀

2006-05-27 12:20
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

, 还是我来说吧。
void insert()不需要返回值,而前面如果没有void 的函数需要一个返回值,一般在函数末尾用return语句返回。而NODE *create()本身就是一个指针,相当于一个数值,在函数的最后用return(head)返回了它的值,NODE *create()在这里等价于 creat(NODE *L),或是creat(NODE L), 当然如果这样改了的话,main()中的a=create();,就需要改成create(a);效果是一样的。

[此贴子已经被作者于2006-5-27 13:13:19编辑过]


我的征途是星辰大海
2006-05-27 13:10
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
以前写的一些东西,现在贴出来,应该有点用

C语言中的&是取变量逻辑地址的操作, 与变量本身所在的物理地址没有关系,它直接与变量的值相关,即使变量本身所在的物理地址改变,对&操作也没有影响,&操作取值不会改变.*是取变量物理地址的操作, 即使变量本身所在的逻辑地址改变,对&操作也没有影响, &操作取值不会改变.但是 一旦物理地址中的数据改变,*操作所得的数据也将随之改变.
这就像是在一栋楼房中找人, &按入住人的名字找人,而*按门牌号找人, 虽然同是找人,但还是有本质上的区别的. 当且仅当门牌号对应的人入住人姓名找的人相同的时候, 找到的人才是同一个人.


&的用法和含义,见下面的例子:

main()

{ int i=3,j=5;

change(i,j);

printf("i1=%d ,%d ",i,j);

}

void change(int n, int m)

{ n=n+m;

printf("n=%d,m= %d ",n,m);

}

运行的结果为:

i1=3,5

n=8, m=5

现把上面的程序改为:

main()

{ int i=3,j=5;

change(&i,j);

printf("i1=%d ,%d ",i,j);

}

void change(int &n, int m)

{ n=n+m;

printf("n=%d,m= %d ",n,m);

}

运行的结果为:

i1=8,5

n=8, m=5

为什么会产生这样的结果?

C语言中的&是取变量地址的操作,在执行

main()

{ int i=3,j=5; 时, 操作系统(os)会对变量i,j分配内存单元,如i的地址是2800,os只管理2800的单元,它并不知变量i,执行i=3;则2800单元中的内容是3,用符号(2800)=3表示,执行调change函数,把i的地址2800传递给n,&n=2800,在执行n+m,则2800单元中的内容变成8,(2800)=8,再退回到main时,执行 printf("i1=%d ,%d ",i,j);则应该把2800单元中的内容输出(注意在os中没有变量的处理,只有对地址的管理),这时2800单元中的内容已变成8,所以输出是i1=8,5。我们注意到此时i和n实际上是共用的同一个地址,所以n的改变会影响上一级的模块中的i变量,即参数的双向传递!

实际中由于c语言并不是一种非常严谨的语言,它本身并不提供参数的双向传递功能,是用地址来实现的。在数据结构的课程中,以后只要发现参数中有&符号,它就是双向传递,即既有输入又有输出,可以把它理解成全局量,但全局量在整个系统的所有模块都起作用,&只在定义的函数(模块)中起作用,可以理解为“局部的全局量”。

&符号我想不出有很好和严谨的描述方法,如果一定要与某些东西类比,在pascal中的VAR是最接近的, 如

Proc change(VAR n:integer, m:integer)


我的征途是星辰大海
2006-05-27 13:22
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
收藏
得分:0 
顶!

奋斗改变一切!!
2006-05-27 20:23
快速回复:单链表的新建,插入问题...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019844 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved