十四127 2021-11-10 01:19 采纳率: 100%
浏览 32
已结题

请各位帮我看看怎么改!


#include <stdlib.h>
typedef int Statu;

typedef struct
{
    int data;
}elementdata;

typedef struct
{
    elementdata element;
    LNode* next;
}LNode;
//头指针定义时用 LNode* head;

void initial_L(LNode** head)
{
    *head = (LNode*)malloc(sizeof(LNode));
    (*head)->next = NULL;
}

void destroy_L(LNode** head)
{
    LNode* p;
    p = *head;
    LNode* s;
    while (p)
    {
        s = p;
        p = p->next;
        free(s);
    }
    *head = 0;
}

int ListLength_L(LNode L)
{
    LNode* p = L.next;
    int j = 0;
    while (p)//此处我们用p但是呢和下面不同我们是从0开始,因为我们要保证可能第一个结点就没有的情况
             //下面的从一开始是因为他有i和j两个变量可以包括了是否为0的情况,但是我们算起长度的时候先前是没有长度的我们
             //必须考虑为0的情况
             //如果我们此处用的就是p.next判断的话就是从1开始,要单独考虑0的时候,而且那个最终结点其实就是
            //要循环n次多了一次访问最后空的那一次
            //而我们从0开始刚好就是n-1次他已经包括了最后为空的那一次而且因为不是p.next不用对0进行讨论
    {
        p = p->next;
        j++;
    }
    return j;
}

Statu Location_L(LNode L, elementdata e, int* i)
{
    LNode* p = L.next;
    int j = 1;//具体问题可以具体分析取1还是取0,因为我们这边用的是p.element.data所以是1因为他的意思是该结点的数据域所以
    //下标就是该结点位置
    while (p && p->element.data != e.data)
    {
        p = p->next;
        j++;
    }
    if (!p)
        return 0;
    return j;
}

Statu GetElem_L(LNode L, int i, elementdata* e)//若此处**指的是head的地址,*指的是L的地址,L直接是让函数复制L中的元素
{
    //L为带头结点的单链表的头指针
    //当第i个元素存在时,将其值赋给e并返回OK,否则ERROR
    LNode* p = L.next;//初始化一个结点类型指针,此处和上次的动态数组不一样,动态数组因为是随机存取所以我们只需要利用索引
    //所以其定义的指针是elementdata指针,而在这里定义节点指针,是用来指向节点的,而不单纯是数据元素因为还有指针域
    //初始化指针使指针指向首元节点
    int j = 1;//计数器为1
    while (p && j < i)
    {
        p = p->next;
        j++;
    }
    //顺指针后查找知道第i个元素或者p为NULL即到了最后一个元素
    if (!p || j > i)
        return 0;//第i个元素不存在 ,此处为什么还要j>i 若链表中没有元素的时候返回节点插入失败。
    *e = p->element;
    return 1;
}

Statu ListInsert_L(LNode* L, int i, elementdata e)//为什么传递指针因为要改值
{
    //在带头结点的单链线性表第i个位置之前插入元素e
    LNode* p = L;//指向头结点
    int j = 0;//头结点时计数器为0
    while (p && j < i - 1)
    {

        p = p->next;
        j++;
    }//使p指向第i-1个节点
    if (!p || j > i - 1)//j>i-1主要是为了判断当i小于1的时候,因为是前插所以要保证在最后一个元素之前
        return 0;
    LNode* s = (LNode*)malloc(sizeof(LNode));//生成新结点
    s->element = e;
    s->next = p->next;
    p->next = s;//插入e
    return 1;
}

Statu ListDelete_L(LNode* L, int i, elementdata e)
{
    //在带头结点的单链线性表中,删除第i个元素,并由e返回其值
    LNode* p;
    int j = 0;//头结点时计数器为0
    p = L;//p先指向头结点,因为若没有头结点删除不方便
    while (p->next && j < i - 1)    //使p可以指向第i-1个元素
    {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1)//位置不合适,!p是保证没有超出链表长度,j>i-1 是为了保证当i为负数时不能运行
        return 0;
    LNode* s = p->next;
    p->next = p->next->next;
    e = s->element;
    free(s);
    return 1;
}

void MergeList_L(LNode* La, LNode* Lb, LNode* Lc)
{
    //已知单链线性表La和Lb的元素按值非递减排列
    //归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列
    LNode* pa = La->next;
    LNode* pb = Lb->next;
    LNode* pc = Lc = La;//用La的头结点作为Lc的头结点
    while (pa && pb)
    {
        if (pa->element.data >= pb->element.data)//结构体是不能用于比较的
        {
            pc->next = pa;
            pc = pa;//或者pc.next
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    while (pa || pb)
        pc->next = pa ? pa : pb;
    free(Lb);//释放Lb的头结点,如果有头指针就要传递二级指针并把,**head = null;
}

编译前未找到相关问题
表以后出现了如下的错误求解决方法

img

img

img

img

展开全部

  • 写回答

1条回答 默认 最新

  • 关注

    typedef struct
    {
    elementdata element;
    LNode* next;
    }LNode;
    改成
    struct LNode
    {
    elementdata element;
    LNode* next;
    };

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    还有就是,LNode类型的变量声明的地方,前面都要加上 struct,比如

    
    void initial_L(struct LNode** head)
    {
        *head = (struct LNode*)malloc(sizeof(struct LNode));
        (*head)->next = NULL;
    }
    

    1
    回复
    十四127 回复 技术专家团-小桥流水 2021-11-10 01:38

    谢谢大大啦,的确可以了,但是为什么会出现这样的问题呢?

    回复
    技术专家团-小桥流水 回复 十四127 2021-11-10 01:55

    因为C里面在使用结构体的时候,要求前面必须加struct关键字。而且你原来的代码,使用typedef的时候,{}里有LNode类型,但是 typedef struct 后面没有这个结构体名,相当于LNode还没定义就使用了

    回复
    展开全部4条评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 已采纳回答 11月10日
  • 创建了问题 11月10日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部