标题:拆分带头结点单链表 循环出不来
取消只看楼主
EVNUE
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2023-3-12
 问题点数:0 回复次数:1 
拆分带头结点单链表 循环出不来
#include <stdio.h>
#include <stdlib.h>
/************************************/
/* 链表实现的头文件,文件名slnklist.h */
/************************************/
typedef int datatype;
typedef struct link_node {
    datatype info;
    struct link_node* next;
}node;


/*****************************************************/
/*  函数功能:建立一个空的带头结点的单链表           */
/*  函数参数:空                                     */
/*  函数返回值:指向node类型变量的指针             */
/*  文件名:hlnklist.c,函数名:init()                    */
/**************************************************** */
node* init()
{
    node* head;
    head = (node*)malloc(sizeof(node));
    head->next = NULL;
    return head;
}


/*****************************************************/
/*  函数功能:输出带头结点的单链表中各个结点的值     */
/*  函数参数:指向node类型变量的指针head            */
/* 函数返回值:无                          */
/*  文件名:hlnklist.c,函数名:display()               */
  /*****************************************************/
void display(node* head)
{
    node* p;
    p = head->next;/*从第一个(实际)结点开始*/
    if (!p) printf("\n带头结点的单链表是空的!");
    else
    {
        printf("\n带头结点的单链表各个结点的值为:\n");
        while (p) { printf("%5d", p->info); p = p->next; }
    }
}


/*****************************************************/
/*  函数功能:在带头结点的单链表中查找第i个结点地址 */
/*  函数参数:指向node类型变量的指针head           */
/*             int类型变量i                          */
/*  函数返回值:指向node类型变量的指针head          */
/*  文件名hlnklist.c,函数名find()                     */
/*****************************************************/
node* find(node* head, int i)
{
    int j = 0;
    node* p = head;
    if (i < 0) { printf("\n带头结点的单链表中不存在第%d个结点!", i); return NULL; }
    else if (i == 0) return p;/*此时p指向的是头结点*/
    while (p && i != j)/*没有查找完并且还没有找到*/
    {
        p = p->next; j++;/*继续向后(左)查找,计数器加1*/
    }
    return p;/*返回结果,i=0时,p指示的是头结点*/
}


/***********************************************************************/
/*  函数功能:在带头结点的单链表中第i个结点后插入一个值为x的新结点 */
/*  函数参数:指向node类型变量的指针head                              */
/*            datatype 类型变量x,int型变量i                            */
 /*  函数返回值:指向node类型变量的指针head                           */
 /* 文件名:hlnklist.c,函数名:insert()                     */
 /***********************************************************************/
node* insert(node* head, datatype x, int i)
{
    node* p, * q;
    q = find(head, i);/*查找带头结点的单链表中的第i个结点*/
    /*i=0,表示新结点插入在头结点之后,此时q指向的是头结点*/
    if (!q)/*没有找到*/
    {
        printf("\n带头结点的单链表中不存在第%d个结点!不能插入%d!", i, x); return head;
    }
    p = (node*)malloc(sizeof(node));/*为准备插入的新结点分配空间*/
    p->info = x;/*为新结点设置值x*/
    p->next = q->next;/*插入(1)*/
    q->next = p;/*插入(2),当i=0时,由于q指向的是头结点,本语句等价于head>next=p */
    return head;
}


void splitlist(node* head1, node* head2)  /*将本函数补充完整。也可以不用我给的函数原型,自己写一个函数*/
{
    node* p, * q, * pre;
    q = NULL;
    pre = NULL;
    p = head1;
    int k = 0;
    while (p) {
        if (((p->info) % 2) == 1) {
            if (k = 0) {
                k = 1;
                head2 = p;
                q = head2;
            }
            else {
                q->next = p;
                q = q->next;
            }
            pre->next = p->next;
            p = p->next;
        }
        else {
            pre = p;
            p = p->next;
        }
    }
}



void main()
{
    node* L1, * L2;
    datatype y;
    int j, n;

    L1 = init();  L2 = init();

    /*建表*/
    printf("请输入带头结点单链表的结点个数:");  scanf("%d", &n);
    printf("请输入带头结点单链表的结点值:");
    for (j = 0; j < n; j++)
    {
        scanf("%d", &y);  L1 = insert(L1, y, j);
    }
    display(L1);

    /*在此处完成对splitlist函数的调用,并进行测试。如果是自己写的函数,同样完成函数的调用和测试*/
    splitlist(L1, L2);
    display(L1);
    display(L2);
}
搜索更多相关主题的帖子: 结点 函数 node head next 
2023-03-12 21:24
EVNUE
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2023-3-12
得分:0 
自己解决了
2023-03-12 21:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511521-1-1.html




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

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