Shimi 发表于 2020-4-4 11:05:03

链表c语言

将链表B接到链表A之后,不用排序,两个链表输入0就停止读入数据,我网上找了很久,都没找到靠谱一点的答案!!!求解,下面是参考的代码
#include<stdio.h>
#include<malloc.h>
void print(char *Info, struct student *Head);

int main(void)
{       
        struct student *ah, *bh;
       
        printf("创建链表A,请输入学号及成绩(均输入为0时表示停止):\n");
        ah = creat();
        printf("\n创建链表B,请输入学号及成绩(均输入为0时表示停止):\n");
        bh = creat();

        print(ah);
        print(bh);
       
        ah = merge(ah, bh);
        print("\n链表A、B合并后:", ah);
       
        return 0;
}

void print(char *Info, struct student *Head)
{
        printf("%s", Info);
        while (Head != NULL)
        {
                printf("%d,%d", Head->num, Head->score);
                Head = Head->next;
        }
}

howzyao 发表于 2020-4-4 11:09:59

creat();
merge(ah, bh);
print(student&);
这三个方法,如何定义的?
能否发来一看?我是初学者,我有兴趣

howzyao 发表于 2020-4-4 11:12:08

ah = merge(ah, bh);
可不可以理解为:
ah 增加后续长度(bh) && 深复制 bh到后续长度 && 释放 bh

Shimi 发表于 2020-4-4 11:17:01

howzyao 发表于 2020-4-4 11:12
ah = merge(ah, bh);
可不可以理解为:
ah 增加后续长度(bh) && 深复制 bh到后续长度 && 释放 bh

代码不完整,应该是定义结构体和函数原型
结构体是
struct Link
{
int data;
struct Link*next
};
struct Link*merge();
struct Link* creat()

howzyao 发表于 2020-4-4 15:09:31

看到了Link结构,从字面上看来,是不是这样:
当学生0存入时,一定是:(迭代时:)
*next==NULL
所以,写入data后,(需要将学生0的Link*current=001,同时将此学生的Link*next=NULL);
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
按已知的 Link结构 和 应该是定义结构体和函数原型  结合思考,得出如下:
这里假设:要写入学生10人:(i==11时,for结束)
第1人时:
必然发现 *next!=NULL,存入data后,同时需要将当前学生标记为 next==i;//即i==1;
此时,只有一个条件:若next==NULL时;此只能是当前学生为最后一名学生,所以,必然地,
需要增加条件:当data!=-1时,说明当前学生还没有录入;
代码如下:
if(data>0 && next==NULL)时,学生是有效的data>=1时,自然next!=NULL;
它需要指向非NULL;所以改为:
if(data>0)时,这是当前已录入过了的学生,各种操作完毕后,只需next++即可到下一位:

学徒2207 发表于 2020-4-5 20:04:59

比方说A的最后一个节点是p,即p->next=NULL,B如果有空的头结点HeadB的话,拼接就是p->next=HeadB->next。创建还有打印也很简单啊
页: [1]
查看完整版本: 链表c语言