| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 683 人关注过本帖
标题:单向链表 求教
只看楼主 加入收藏
作弊
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-11-3
收藏
得分:0 

你说的对 是我错了

#include<stdio.h>

swap(int *a, int *b)
{
int *sss;
sss = (int *)malloc(sizeof(int));
printf("==================\n");
printf("in swap function\n");
printf("==================\n");
printf("%p, %p, %p\n", a, b, sss);
*sss = *a;
*a = *b;
*b = *sss;
}

main()
{
int *aD;
int *bD;
aD = (int *)malloc(sizeof(int));
bD = (int *)malloc(sizeof(int));
*aD=3;
*bD=4;
printf("aD addr is: %p, %d\n",aD, *aD);
printf("bD addr is: %p, %d\n",bD, *bD);
swap(aD,bD);
printf("aD addr is: %p, %d\n",aD, *aD);
printf("bD addr is: %p, %d\n",bD, *bD);
getch();
}

这样就可以了

必需要修改pointer 里面的内容

*head = *insert

2007-11-05 19:02
duran04
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-4
收藏
得分:0 

同问,顶!

2007-11-05 19:05
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

回12楼:

那你在swap()函数中动态生成的sss的空间如何回收?


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-05 19:11
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

不过我总算想明白了。
我需要修改

insert(node *head, int i, int x)

中的head的内容,是无法完成目的的。
因为C在传递参数时采用的是传值调用。
因此必须修改函数原型为

insert(node **head,int i,int x)

这样就可以完成任务了。

附修改后的源程序:

#include<stdio.h>
#include<alloc.h>

typedef struct linknode
{
int data;
struct linknode *next;
}node;

node *creat() //建立不带头节点的单向链表
{
node *head,*p,*s;
int x,cycle=1;
head=(node *)malloc(sizeof(node)); //建立头节点
head->next=NULL; //使头节点指针域为空
p=head;
while(cycle) //建立带头节点的单向链表
{
scanf("%d",&x);
if(x!=0)
{
s=(node *)malloc(sizeof(node));
s->data=x;
p->next=s;
p=s;
}
else cycle=0;
}
p->next=NULL; //使尾节点指针域为空
s=head; //删除头节点并使head指向第一个节点
head=head->next;
free(s);
return head; //返回第一个节点的指针
}

void printout(node *WFY) //输出节点的data值
{
if(WFY==NULL) //根本不需要引入临时变量temp
{
printf("空表\n");
}
else while(WFY)
{
printf("%d",WFY->data);
WFY=WFY->next;
}
printf("输出完毕\n");
}


node *find(node *head,int x) //同理此处也不用引入临时变量p,不用担心head的变化不会修改主函数中的head
{
if(head==NULL)
{
printf("空表,节点未找到\n");
}
else
{
while(head!=NULL && head->data!=x) head=head->next;
if(head!=NULL) printf("节点找到\n");
else printf("节点未找到\n");
}
return head;
}

int length(node *head)
{
int n=0;
node *p;
p=head;
while(p!=NULL)
{
p=p->next;
n++;
}
return n;
}

node *insert(node **head,int i,int x) //在单链表中第i个节点之后插入一个元素为x的节点
/*疑问已解决*/

{

node *insert;
node *p;
int j;
if(i==0)
{
insert=(node *)malloc(sizeof(node));
insert->data=x;
insert->next=*head;
*head=insert; //关键之处
return insert;
}
else
{
p=*head;j=1;
while(p!=NULL &&j<i)
{
p=p->next;
j++;
}
if(p!=NULL)
{
insert=(node *)malloc(sizeof(node));
insert->data=x;
insert->next=p->next;
p->next=insert;
return insert;
}
else
{
printf("不存在第%d个节点\n",i);
return NULL;
}
}

}

int main()
{
node *a;
node *b;
int c,d,e;
a=creat();
printout(a);
scanf("%d",&c);
b=find(a,c);
printf("%d",b->data);
printf("输入插入位置:");
scanf("%d",&d);
printf("输入插入值:");
scanf("%d",&e);
insert(&a,d,e);
printout(a);
return 0;
}



我已在turboc++3.1中运行通过,不只是否还有问题,望高手不吝赐教。
感谢 大侠 作弊 的热心帮助。

所以说,C语言在通过参数传值时很多时候都没有C++的引用方便。


[此贴子已经被作者于2007-11-5 19:35:08编辑过]


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-05 19:18
gookee
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-24
收藏
得分:0 
2007-11-05 19:21
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

大侠 作弊 哪儿去了? 请看看我编辑后的帖子。


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-05 19:48
快速回复:单向链表 求教
数据加载中...
 
   



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

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