打印
[嵌入式linux]

请教双向循环链表问题

[复制链接]
2343|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天学习双向循环链表的操作,参考数据结构相关书籍,欲实现链表的建立、输出、删除、插入与排序,但今天在链表的创建即遇难题,在运行是始终提示错误,百思不得其解。特发上来,望各位高手指教,使用编译器是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;
}

相关帖子

来自 2楼
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函数任何内容就可以啦!

使用特权

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

使用特权

评论回复
6
ntao0227|  楼主 | 2010-5-6 19:54 | 只看该作者
受益非浅

使用特权

评论回复
7
jiangfuquan999| | 2012-5-10 13:10 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

125

帖子

1

粉丝