VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3004|回复: 11

链表操作详解(转)

  [复制链接]
33_avatar_middle
在线会员 发表于 2009-8-15 17:50:52 | 显示全部楼层 |阅读模式
#include   
using namespace std;  
struct test  
{  
    int number;  
    float socre;  
    test *next;  
};  
test *head;//创建一个全局的引导进入链表的指针  
  
test *create()  
{  
    test *ls;//节点指针  
    test *le;//链尾指针  
    ls = new test;//把ls指向动态开辟的堆内存地址  
    cout<<"请输入第一个节点number和节点score,输入0.0跳出函数"<<ENDL;  
    cin>>ls->number>>ls->socre;  
    head="NULL";//进入的时候先不设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序  
    le="ls";//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le->next,也就是下一个节点的位置  
    while(ls->number!=0)//创建循环条件为ls->number的值不是null,用于循环添加节点  
    {  
        if(head==NULL)//判断是否是第一次进入循环  
        {  
            head="ls";//如果是第一次进入循环,那么把引导进入链表的指针指向第一次动态开辟的堆内存地址  
        }  
        else  
        {  
            le->next="ls";//如果不是第一次进入那么就把上一次的链尾指针的le->next指向上一次循环结束前动态创建的堆内存地址  
        }  
        le="ls";//设置链尾指针为当前循环中的节点指针,用于下一次进入循环的时候把上一次的节点的next指向上一次循环结束前动态创建的堆内存地址  
        ls="new" test;//为下一个节点在堆内存中动态开辟空间  
        cout<<"请下一个节点number和节点score,输入0.0跳出函数"<<ENDL;  
        cin>>ls->number>>ls->socre;  
    }  
    le->next="NULL";//把链尾指针的next设置为空,因为不管如何循环总是要结束的,设置为空才能够在循环显链表的时候不至于死循环  
    delete ls;//当结束的时候最后一个动态开辟的内存是无效的,所以必须清除掉  
    return head;//返回链首指针  
}  
void showl(test *head)  
{  
    cout<<"链首指针:"<<HEAD<<ENDL;  
    while(head)//以内存指向为null为条件循环显示先前输入的内容  
    {  
        cout<number<<"|"<socre<<ENDL;  
        head="head"->next;  
    }  
}  
void deletel(test *&head,int number)//这里如果参数换成test *head,意义就完全不同了,head变成了复制而不是原有链上操作了,特别注意,很多书上都不对这里  
{  
    test *point;//判断链表是否为空  
    if(head==NULL)  
    {  
        cout<<"链表为空,不能进行删除工作!";  
        return;  
    }  
  
    int derror="1";//设置找不到的情况的条件,预先设置为真  
    test *check="head";  
    while(check)//利用循环进行查找  
    {  
        if (check->number==number)  
        {  
            derror="0";//条件转为假  
        }  
        check="check"->next;  
    }  
    if(derror)//如果为假就跳出函数  
    {  
        return;  
    }  
  
    if(head->number==number)//判删除的节点是否为首节点  
    {  
        point="head";  
        cout<<"删除点是链表第一个节点位置!";  
        head="head"->next;//重新设置引导指针  
        delete point;  
        return;  
    }  
    test *fp="head";//保存连首指针  
    for(test *&mp="head";mp->next;mp="mp"->next)  
    {  
        if(mp->next->number==number)  
        {  
            point="mp"->next;  
            mp->next="point"->next;  
            delete point;  
            head="fp";//由于head的不断移动丢失了head,把进入循环前的head指针恢复!  
            return;  
        }  
    }  
}  
  
void insterl(int number)  
{  
    test *point="new" test;  
    cout<<"请输入节点number和节点score"<<ENDL;  
    cin>>point->number>>point->socre;  
  
    if(head==NULL)//链表为空的情况下插入  
    {  
        head="point";  
        point->next="NULL";  
        return;  
    }  
  
    int ierror="1";//设置找不到的情况的条件,预先设置为真  
    test *le;  
    test *check="head";  
    while(check)//利用循环进行查找  
    {  
        if (check->number==number)  
        {  
            ierror="0";//条件转为假  
        }  
        le="check";  
        check="check"->next;  
    }  
    if(ierror)  
    {  
        cout<number;  
        le->next="point";  
        point->next="NULL";  
        return;  
    }  
  
   if(head->number==number)//检测是否是在第一个节点处插入  
    {  
        point->next="head";  
        head="point";  
        return;  
    }  
  
    for(test *&mp="head";mp->next;mp="mp"->next)//在链表中间插入  
    {  
        if(mp->next->number==number)  
        {  
            point->next="mp"->next;  
            mp->next="point";  
            return;  
        }  
    }  
  
}  
void main()  
{  
    head="create"();//调用创建  
    showl(head);  
    int dp;  
    cout<<"请输入删除点如果找不到就跳出函数"<<ENDL;  
    cin>>dp;  
    deletel(head,dp);//调用删除  
    showl(head);  
    int ip;  
    cout<<"请输入插入点如果找不到就在链尾添加"<<ENDL;  
    cin>>ip;  
    insterl(ip);  
    showl(head);  
    cin.get();  
    cin.get();  
}




上一篇:C语言的程序结构
下一篇:C程序设计的常用算法
25_avatar_middle
在线会员 发表于 2010-1-21 17:31:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
20_avatar_middle
在线会员 发表于 2010-1-29 13:51:00 | 显示全部楼层
顶上顶上,学习!
04_avatar_middle
在线会员 发表于 2010-2-1 11:17:08 | 显示全部楼层
很好啊,注释非常非常详细,这样是最好的,顶起。
72_avatar_middle
在线会员 发表于 2010-4-14 17:19:36 | 显示全部楼层
全蒙!超级菜鸟,任重道远!
37_avatar_middle
在线会员 发表于 2010-5-11 18:09:08 | 显示全部楼层
恩,挺好的,学习了链表操作详解(转)
05_avatar_middle
在线会员 发表于 2010-6-9 14:44:26 | 显示全部楼层
顶上顶上,学习!
61_avatar_middle
在线会员 发表于 2010-6-21 15:43:15 | 显示全部楼层
好好看看,后面能用的上
12_avatar_middle
在线会员 发表于 2010-6-27 09:55:25 | 显示全部楼层
链表真的好重要啊。。一定要学习学习
16_avatar_middle
在线会员 发表于 2010-9-13 20:13:45 | 显示全部楼层
今天老师就讲到这个……正序、逆序创建链表
10_avatar_middle
在线会员 发表于 2011-8-8 17:30:44 | 显示全部楼层
链表操作详解(转)。。。。。。。。。。。。。。。。
26_avatar_middle
在线会员 发表于 2016-7-13 23:44:13 来自手机 | 显示全部楼层
我就笑笑不说话1468420254.25
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-1-22 00:51

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表