| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 272 人关注过本帖
标题:关于插入链表的问题
只看楼主 加入收藏
yudeyinji198
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:133
注 册:2012-8-30
结帖率:96%
收藏
已结贴  问题点数:10 回复次数:3 
关于插入链表的问题
你们好,这里建立个链表,有2个结点,想插入一个结点,可是编译后,运行,无反应,请问什么回事呢?谢谢!

代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(struct student)    //定义结构常量
#define NULL 0
struct student                        //定义结构体
{
    int num;
    float sorce;
    struct student *next;
};

   struct student *insert(struct student *head,struct student *s)//定义插入链表函数
 {
    struct student *p1,*p2,*p0;
    p0=s;                            //p0为待插入结点
    p1=head;                        //p1指向头结点
    if(head==NULL)                    //如果输入的头结点为空
    {
        head=p0;                    //把待插入结点当做头结点
        p0->next=NULL;                //指向空,即只有插入的一个节点
        
    }
    else
    {
        while((p0->num>p1->num) && (p1->next!=NULL))//查询,判断结点位置,如果插入节点在p1后面,让p1再指向下一个结点,直到符合插入条件
        {
            p2=p1;
            p1=p1->next;
        }
    }
    //找到插入位置
    if(p0->num <= p1->num)
    {
        if(p1==head)                //如果是在头结点之前
        {
            p0->next=head;            //插入在头结点之前
            head=p0;               
            
        }
        else
        {
            p2->next=p0;            //如果在头尾之间,把前一个结点的尾指针指向待插入结点p0
            p0->next=p1;            //把待插入节点尾指针指向后一个结点,即p1
        }
    }
    else                            //如果待插入结点在最后一个结点后面
    {
        p1->next=p0;                //把最后一个结点的尾指针指向待插入节点
        p0->next=NULL;                //待插入结点尾指针指向空
        
    }

    return head;                    //返回修改后结点的头结点地址
    }

 

void print(struct student *head)    //定义逐个打印子函数
{
    int k=0;                        //定义结点数
    struct student *pt;
    pt=head;                        //要打印链表的头结点地址
    while(pt!=NULL)                    //循环,直到为空,即最后一个结点
    {
    k++;                    
    printf("%d,%d,%f\n",k,pt->num,pt->sorce);//打印,第几个结点,并且结点数据
    pt=pt->next;                    //指向下一个结点继续打印
    }

}

void main()                            //主函数
{
    struct student *pt,*head;
    head=NULL;                        //先把head指向空,赋初值。
    //为链表中2个结点赋值
    head=(struct student *)malloc(LEN);//分配空间
    head->next=(struct student *)malloc(LEN);
    //定义第一个结点,静态
    head->num=5;
    head->sorce=100;
    head->next->num=10;
    head->next->next=NULL;

    //构造待插入结点
    pt=(struct student *)malloc(LEN);
    pt->num=8;
    pt->next=NULL;
    insert(head,pt);    //插入
    print(head);        //打印
    system("pause");
}
搜索更多相关主题的帖子: next 结构体 include insert 
2012-11-10 21:13
yudeyinji198
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:133
注 册:2012-8-30
收藏
得分:0 
没高手帮帮忙么?
2012-11-11 16:15
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:10 
NULL和0是不一样的.建议不要自己定义,null表示没有,空.不是0
你这个是有头节点的单链表.head只要保存next的指针就可以了. 不用赋值

成功贵在坚持
2012-11-11 16:24
yudeyinji198
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:133
注 册:2012-8-30
收藏
得分:0 
回复 2楼 yudeyinji198
哦哦,明白了,可行,谢谢斑竹!!
2012-11-11 20:41
快速回复:关于插入链表的问题
数据加载中...
 
   



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

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