请教双向循环链表问题
今天学习双向循环链表的操作,参考数据结构相关书籍,欲实现链表的建立、输出、删除、插入与排序,但今天在链表的创建即遇难题,在运行是始终提示错误,百思不得其解。特发上来,望各位高手指教,使用编译器是Dev-C++源程序如下:
#include <stdio.h>
#include <stdlib.h>
struct linkedlist
{
int dt;
struct linkedlist *prev;
struct linkedlist *next;
};
//void insnod(struct linkedlist *ln,int data);
void createlinked(struct linkedlist *hl,int no);
void printlinked(struct linkedlist *phl);
void delnod(struct linkedlist *hl,int deln);
struct linkedlist *findnod(struct linkedlist *hl,int sdt);
int main(void)
{
struct linkedlist *hd;
int n;
printf("How length of linkedlist:");
scanf("%d",&n);
printf("length is linkedlist:%d\n",n);
createlinked(hd,n);
printlinked(hd);
printf("What data you want delete");
scanf("%d",&n);
printf("Data '%d' will be delete\n");
delnod(hd,n);
system("PAUSE");
return 0;
}
//void insnod(struct linkedlist *ln,int data)
//{
// struct linkedlist *pl;
// pl=findnod(ln,data);
// pl->next->prev=pl->prev;
// pl->prev->next=pl->next;
// free(pl);
//}
void createlinked(struct linkedlist *hl,int no)
{
int i;
struct linkedlist *pl,*pj,*po;
hl=(struct linkedlist *)malloc(sizeof(struct linkedlist));
if(NULL==hl)
{
printf("Out of space!\n");
}
hl->prev=hl;
hl->next=hl;
printf("Pls. input data of linkedlist:");
pj=hl;
for(i=0;i<no;i++)
{
pl=(struct linkedlist *)malloc(sizeof(struct linkedlist));
if(NULL==pl)
{
printf("Out of space!\n");
}
scanf("%d",pl->dt);
pl->next=hl;
pl->prev=pj;
pj->next=pl;
hl->prev=pl;
pj=pl;
}
}
void printlinked(struct linkedlist *phl)
{
struct linkedlist *pl;
int n=0;
pl==phl->next;
printf("H");
while(pl!=phl)
{
n++;
pl=pl->next;
printf("r");
}
printf("linkedlist length:%d\n",n);
// printf("Linkedlist is:");
// while(pl!=phl)
// {
// printf("%d. ",pl->dt);
// pl=pl->next;
// }
// printf(" END\n");
}
void delnod(struct linkedlist *hl,int deln)
{
struct linkedlist *pl;
pl=findnod(hl,deln);
if(NULL!=pl)
{
pl->next->prev=pl->prev;
pl->prev->next=pl->next;
free(pl);
printf("Delete OK!\n");
}
else
{
printf("Can't find the data.\n");
}
}
struct linkedlist *findnod(struct linkedlist *hl,int sdt)
{
struct linkedlist *pl;
pl=hl;
do
{
if(sdt==pl->dt)
break;
else
pl=pl->next;
}
while(pl!=hl);
if(pl!=hl)
return pl;
else
return NULL;
} 我暂时发现你程序中三个错误:
1、在第63行,createlinked函数中的scanf("%d",pl->dt);,应该改为:scanf("%d",&pl->dt);
2、void createlinked(struct linkedlist *hl,int no)函数应该改变void createlinked(struct linkedlist **hl,int no),函数实现里面关于hl的引用要相应改成(*hl),调用这个函数应该改成createlinked(&hd,n);
3、在第76行,printlinked函数中的pl==phl->next;应该改成pl=phl->next;
关于这三个问题,前面两个是你对C语言中指针和局部变量理解不够,后面一个估计是你的笔误。
我改过之后的输出如下(我不会在这里粘贴图片,呵呵):
How length of linkedlist:3
length is linkedlist:3
Pls. input data of linkedlist:12
13
43
Hrrrlinkedlist length:3
What data you want delete 自己来顶 感谢楼上的回复!
程序调试通过啦!
对于第二点开始不怎么明白,为什么要用指针呢?参数的传递用指针不是完全可以的吗?利用寻址&把指针传给指针的指针和原来的操作不是一会事吗?是不是因为指向结构体的指针在初始化是并没有分配内存(这和其他类型指针不一样)呢?在原来的程序中参数传递的指针在函数里分配内存,这是不是涉及到作用域的问题,或者是重复定义的问题呢?后来将内存分配放在调用函数之前进行,不改变createlinked函数任何内容就可以啦! 你传递的的确是一个指针(以下的指针即指这个指针变量),指针本质上也是一个变量,所以传递的时候只是在函数的栈里面复制了这个指针的一个副本,你在函数里面想改变这个指针的值实际上改变的是这个副本的值,并没有改变到指针本身。要想真正改变指针本身必须传递它的地址,在函数里面改变这个地址中的值就OK啦。
建议你认真再看看C语言指针这一章。 受益非浅 :)
页:
[1]