• 全部
  • 问答

高手请进来看下这个具有挑战性的问题!

笨笨肥肥 2011-05-08 12:49:19
#define null 0
struct node
{
int data;
struct node *next;
};
struct node *p,*L,*s,*q; //全局变量
int n,e; //全局变量
creater(int n) //创建有n个元素的链表,顺序插入结点
{
int i,k;
L=(struct node *)malloc(sizeof(struct node)); //动态分配地址
L->next=null; //初始化链表(带头结点)
s=L;
for(i=1;i<=n;i++) //输入n个元素,存放在单链表L中(尾插法,S为尾指针)
{printf("input %d:",i);
scanf("%d",&k);
p=(struct node *)malloc(sizeof(struct node)); //增加结点
p->data=k; //对结点的元素赋值
s->next=p; //把新增结点的地址赋给上一个结点的next成员
s=p; //s指向结点p
}
p->next=null; //最后一个结点的地址为null
}

print() //按顺序输出L中的元素
{
struct node *p;
p=L->next; //从第一个结点开始输出
while(p)
{printf("%d ",p->data);
p=p->next;
}
}

delete(int i) //删除L中第i个元素,并把删除的元素输出
{
int e;
int j=0;
struct node *p;
if(i<1 ||i>n) //i的位置不正确
printf("error\n");
else
{p=L; //L为头结点
while(j<i-1) //找到第i个结点的前驱结点,循环i-1次,从头结点开始查找
{
p=p->next;
j++;
}
q=p->next; //删除第i个元素
p->next=q->next;
e=q->data;
free(q); //释放结点
printf("\ndeleted is:%d\n",e);
}
}
insert(int i,int x)
{
int j;
if(i<1 ||i>n+1)
printf("insert error!\n");
else
{
j=0,p=L; //L为头结点
while(j<i-1) //查找第i个元素的前驱结点
{p=p->next;j++;}
q=(struct node *)malloc(sizeof(struct node)); //动态分配新结点
q->next=p->next; //插入新结点
q->data=x;
p->next=q;
}
}

main()
{
int i,j,x;
printf("\nn=");
scanf("%d",&n);
creater(n); //创建链表
printf("\nnew link:");
print(); //输出链表的元素
printf("\ndelete position: ");
scanf("%d",&i);
delete(i); //删除链表中的元素
printf("\nafter deleted,the link is:");
print(); //输出删除后元素 后的链表
printf("\ninsert new element:");
scanf("%d",&x);
printf("\n insert position:");
scanf("%d",&i);
insert(i,x); //插入元素
printf("atfer insertde,the new link is:");
print(); //输出插入元素后的链表中的各元素
getch();
}
这段代码是正确切可以运行的!
...全文
80 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
张小毛 2011-05-08
局部变量覆盖全局变量
回复
笨笨肥肥 2011-05-08
但是如果我把main()函数中的定义改变一下,原来是int i,j,x变为了int i,j,n,x
大家看下运行结果无论是插入还是删除都是会显示“error!”和“insert error!”,而无法运行下面的删除和插入的算法。
我用的编译器是VC6.0的,请各位大大调试以后帮忙回答下这个问题。
回复
jialejiahi 2011-05-08
[Quote=引用 1 楼 fengxingyu1215 的回复:]
但是如果我把main()函数中的定义改变一下,原来是int i,j,x变为了int i,j,n,x
大家看下运行结果无论是插入还是删除都是会显示“error!”和“insert error!”,而无法运行下面的删除和插入的算法。
我用的编译器是VC6.0的,请各位大大调试以后帮忙回答下这个问题。
[/Quote]
给楼主的建议:
1 改了不行的原因是,前面n已经被声明为全局变量,在insert和delete函数中用到了该全局变量,如果再在
main函数中声明一个n,则赋值的是局部变量n,全局变量n没有被赋值初始化,所以出错。
2 不要用n, e等看不出含义的变量名。
3 注释没必要打太多,能说明程序含义和代码比较独特的地方即可。
4 注意缩进和排版!
回复
jialejiahi 2011-05-08
先帮楼主排了一下版:

#include <stdio.h>
#include <stdlib.h>
#define null 0

struct node
{
int data;
struct node *next;
};
struct node *p, *L, *s, *q;
int n, e;

creater (int n) //创建有n个元素的链表,顺序插入结点
{
int i, k;
L = (struct node *) malloc (sizeof (struct node));
L->next = null;
s = L;
for (i = 1; i <= n; i++)
{
printf ("input %d:", i);
scanf ("%d", &k);
p = (struct node *) malloc (sizeof (struct node));
p->data = k;
s->next = p;
s = p;
}
p->next = null;
}

print () //按顺序输出L中的元素
{
struct node *p;
p = L->next;
while (p)
{
printf ("%d ", p->data);
p = p->next;
}
}

delete (int i) //删除L中第i个元素,并把删除的元素输出
{
int e;
int j = 0;
struct node *p;
if (i < 1 || i > n)
printf ("error\n");
else
{
p = L; //L为头结点
while (j < i - 1) //找到第i个结点的前驱结点,循环i-1次,从头结点开始查找
{
p = p->next;
j++;
}
q = p->next; //删除第i个元素
p->next = q->next;
e = q->data;
free (q); //释放结点
printf ("\ndeleted is:%d\n", e);
}
}

insert (int i, int x)
{
int j;
if (i < 1 || i > n + 1)
printf ("insert error!\n");
else
{
j = 0, p = L; //L为头结点
while (j < i - 1) //查找第i个元素的前驱结点
{
p = p->next;
j++;
}
q = (struct node *) malloc (sizeof (struct node)); //动态分配新结点
q->next = p->next; //插入新结点
q->data = x;
p->next = q;
}
}

int main ()
{
int i, j, x;
printf ("\nn=");
scanf ("%d", &n);
creater (n);
printf ("\nnew link:");
print ();
printf ("\ndelete position: ");
scanf ("%d", &i);
delete (i);
printf ("\nafter deleted,the link is:");
print ();
printf ("\ninsert new element:");
scanf ("%d", &x);
printf ("\n insert position:");
scanf ("%d", &i);
insert (i, x);
printf ("atfer insertde,the new link is:");
print ();
getchar();

return 0;
}
回复
maoxing63570 2011-05-08
楼主的代码真的很有挑战性
回复
AnYidan 2011-05-08
写代码的风格很重要,在检查错误时,起码不会连自己都不愿多看
回复
xuwmzi 2011-05-08
更严重的是,你的代码写的太乱了,正常而言,这是很恐怖的一件事.
回复
x1m2j3-hq 2011-05-08
楼上说的对,就是全局变量和局部变量的问题
回复
笨笨肥肥 2011-05-08
呵呵,谢谢各位大大了!以后一定改!
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2011-05-08 12:49
社区公告
暂无公告