ntao0227 发表于 2010-5-2 21:14

请教双向循环链表问题

今天学习双向循环链表的操作,参考数据结构相关书籍,欲实现链表的建立、输出、删除、插入与排序,但今天在链表的创建即遇难题,在运行是始终提示错误,百思不得其解。特发上来,望各位高手指教,使用编译器是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;
}

zhangkef0904 发表于 2010-5-4 17:22

我暂时发现你程序中三个错误:
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

ntao0227 发表于 2010-5-3 10:09

自己来顶

ntao0227 发表于 2010-5-4 21:03

感谢楼上的回复!
程序调试通过啦!
对于第二点开始不怎么明白,为什么要用指针呢?参数的传递用指针不是完全可以的吗?利用寻址&把指针传给指针的指针和原来的操作不是一会事吗?是不是因为指向结构体的指针在初始化是并没有分配内存(这和其他类型指针不一样)呢?在原来的程序中参数传递的指针在函数里分配内存,这是不是涉及到作用域的问题,或者是重复定义的问题呢?后来将内存分配放在调用函数之前进行,不改变createlinked函数任何内容就可以啦!

zhangkef0904 发表于 2010-5-5 11:49

你传递的的确是一个指针(以下的指针即指这个指针变量),指针本质上也是一个变量,所以传递的时候只是在函数的栈里面复制了这个指针的一个副本,你在函数里面想改变这个指针的值实际上改变的是这个副本的值,并没有改变到指针本身。要想真正改变指针本身必须传递它的地址,在函数里面改变这个地址中的值就OK啦。
建议你认真再看看C语言指针这一章。

ntao0227 发表于 2010-5-6 19:54

受益非浅

jiangfuquan999 发表于 2012-5-10 13:10

:)
页: [1]
查看完整版本: 请教双向循环链表问题