| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1583 人关注过本帖
标题:带有头节点的链表插入问题
只看楼主 加入收藏
FireRabbit
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-8-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
带有头节点的链表插入问题
InsertNode函数:

error C2223: left of '->next' must point to struct/union

p、q均为结构体指针,为什么还会出现这样的错误?
程序代码:
#include<stdio.h>
#define datatype int
struct node
{
    datatype dd;
    struct node *next;
};
typedef struct node Node;
typedef struct node *Nodep;
Nodep init(Nodep L)
{
    //初始化表,带有头节点
    L=(Nodep)malloc(sizeof(Node));
    if(L==NULL)
    {
        printf("申请内存失败!\n");
        exit(0);
    }
    L->next=NULL;
    return L;
}
datatype ListLength(Nodep L)
{
    //返回表的长度
    Nodep p=L->next;
    int i=0;
    while(p!=NULL)
    {
        i++;
        p=p->next;
    }
    return i;
}
Nodep GetNode(Nodep L,datatype n)
{
    //返回n位置的节点
    Nodep p=L->next;
    int i=1;
    if((n<1)||(n>ListLength(L)))
    {
        printf("引用了错误的位置!\n");
        exit(0);
    }
    while((p!=NULL)&&(i<n))
    {
        i++;
        p=p->next;
    }
    return p;
}
datatype SearchNode(Nodep L,datatype value)
{
    //返回值为value节点所在位置,如果没有找到则返回0
    Nodep p=L->next;
    int i=1;
    while((p!=NULL)&&(p->dd!=value))
    {
        i++;
        p=p->next;
    }
    if(p!=NULL)
        return i;
    else
        return 0;
}
void LinkAddNode(Nodep L,datatype value)
{
    //在链表尾部添加值为value的节点
    Nodep p,q;
    p=L->next;
    q=(Nodep)malloc(sizeof(Node));
    if(q==NULL)
    {
        printf("申请内存失败!\n");
        exit(0);
    }
    q->dd=value;    //新节点赋值
    q->next=NULL;    //新节点指向
    if(p==NULL)
        L->next=q;    //如果是空表
    else
    {
        while(p->next!=NULL)    //循环找到最后一个节点
            p=p->next;
        p->next=q;    //最后一个节点与新节点进行连接
    }
}
void NodeDel(Nodep L,datatype value)
{
    //删除值为value的节点
    Nodep p,pre;
    int i=SearchNode(L,value);    //值为value节点的位置
    if(i==0)
    {
        printf("错误的值!\n");
        exit(0);
    }
    else
    {
        p=GetNode(L,i);        //取得值为value的节点
        pre=GetNode(L,i-1);    //取得值为value的节点的前一个节点
        pre->next=p->next;    //重新连接
        free(p);        //释放占用的空间
    }

}
void InsertNode(Nodep L,datatype n,datatype value)
{
    //在表的第n的位置插入值为value的节点
    if((n<1)||(n>ListLength(L))
    {
        printf("错误的位置!\n");
        exit(0);
    }
    Nodep p=L->next;
    Nodep q=(Nodep)malloc(sizeof(Node));
    if(q==NULL)
    {
        printf("申请内存失败!\n");
        exit(0);
    }
    q->dd=value;    //新节点赋值
    if(p==NULL)
    {
        L->next=q;    //如果是空表则新节点成为第一个节点
        q->next=NULL;
    }
    else
    {
        p=GetNode(L,n);        //取得第n个位置的节点
        q->next=p->next;
        p->next=q;
    }


}
void PutLink(Nodep L)
{
    //输出链表的所有数据
    Nodep p=L->next;
    if(L->next==NULL)
        printf("这是一个空表!");
    else
    {
        while(p!=NULL)
        {
            printf(" %d ",p->dd);
            p=p->next;
        }
    }
    printf("\n");
}
int main(void)
{
    Nodep L;
    Nodep p;
    int i;
    L=init(L);
    for(i=0;i<10;i++)
        LinkAddNode(L,i);
    printf("输出表的数据:");
    PutLink(L);
    printf("当前表共有%d个数据。\n",ListLength(L));
    printf("值为5的数据在表中位置:%d\n",SearchNode(L,5));
    NodeDel(L,5);
    printf("将值为5的数据删除以后,新的表为:");
    PutLink(L);
    printf("当前表共有%d个数据。\n",ListLength(L));
    printf("找到第3个位置的值:%d\n",GetNode(L,3)->dd);
    printf("在第4个位置插入5:");
    InsertNode(L,4,5);
    PutLink(L);
    return 0;
}


[此贴子已经被作者于2015-10-18 07:41编辑过]

搜索更多相关主题的帖子: 结构体 
2015-10-18 07:39
the_second
Rank: 2
等 级:论坛游民
帖 子:115
专家分:80
注 册:2015-9-13
收藏
得分:7 
typedef struct node
{
                     .
                     .
                     .
}A;
2015-10-18 08:16
FireRabbit
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-8-6
收藏
得分:0 
回复 2楼 the_second
好像不是定义的问题,插入和添加(LinkAddNode)函数有些类似,如果是定义问题的话前面那个函数也应该会出错。

我的愿望是用C++开发自己的游戏引擎。
在此之前还有许多东西要学……
2015-10-18 08:44
鲤鱼爱美丽
Rank: 8Rank: 8
来 自:冥界
等 级:蝙蝠侠
威 望:5
帖 子:288
专家分:843
注 册:2015-4-8
收藏
得分:7 
The variable 'L' is being used without being initialized.

代码代码,带着的石头码!!!
2015-10-18 17:06
鲤鱼爱美丽
Rank: 8Rank: 8
来 自:冥界
等 级:蝙蝠侠
威 望:5
帖 子:288
专家分:843
注 册:2015-4-8
收藏
得分:0 
输出表的数据: 0  1  2  3  4  5  6  7  8  9
当前表共有10个数据。
值为5的数据在表中位置:6
将值为5的数据删除以后,新的表为: 0  1  2  3  4  6  7  8  9
当前表共有9个数据。
找到第3个位置的值:2
在第4个位置插入5: 0  1  2  3  5  4  6  7  8  9

--------------------------------
Process exited after 0.3896 seconds with return value 0
请按任意键继续. . .

代码代码,带着的石头码!!!
2015-10-18 17:10
FireRabbit
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-8-6
收藏
得分:0 
已经找到问题了知道真相真是欲哭无泪啊!!
注释竟然会出现这样的事情,以后要多加注意了。
程序代码:
void InsertNode(Nodep L,datatype n,datatype value)

 {
     Nodep p=L->next;        //将这两个移动到注释前就OK了
     Nodep q=(Nodep)malloc(sizeof(Node));
     //在表的第n的位置插入值为value的节点
    if((n<1)||(n>ListLength(L))
     {
         printf("错误的位置!\n");
         exit(0);
     }
     if(q==NULL)
     {
         printf("申请内存失败!\n");
         exit(0);
     }
     q->dd=value;    //新节点赋值
    if(p==NULL)
     {
         L->next=q;    //如果是空表则新节点成为第一个节点
        q->next=NULL;
     }
     else
     {
         p=GetNode(L,n);        //取得第n个位置的节点
        q->next=p->next;
         p->next=q;
     }


 }


我的愿望是用C++开发自己的游戏引擎。
在此之前还有许多东西要学……
2015-10-18 17:47
快速回复:带有头节点的链表插入问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021367 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved