不过我总算想明白了。
我需要修改
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编辑过]