在STL/MFC里的链表类强大支持下,回头看看曾经走过来的路...(原创)

原创 2005年04月28日 00:51:00

这些天开始搞BREW,因为它没有STL/MFC的链表支持,所以不得不巩固一下以前所学的链表,有些感想,想与大家分享一下

#include "stdafx.h"
#include <iostream.h>
struct Student
{
 long  number;
 float  score;
 Student  *next;
};

Student *head; //链首指针

Student *Create()
{
 Student *pS; //创建的结点指针
 Student *pEnd; //链尾指针,用于在其后面插入结点

 pS = new Student; //新建一个结点,准备插入链表
 cin>>pS->number>>pS->score;
 head = NULL;
 pEnd = pS;   //让尾指针指向刚才生成的堆地址

 while(pS->number!=0)
 {
  if(head==NULL)
   head = pS;  //当head指向的地方为空,则把它做为首地址
  else
   pEnd->next = pS; //此处很重要,当两个相同类型的指针指向同一个地址,并且改变它们中任何一个成员值,另一个也随之改变,这就是间接引用

  pEnd = pS;   //当第二次循环时,需要把pEnd指向pS = new Student出来的新地址
  pS = new Student;
  cin>>pS->number>>pS->score;
 }
 pEnd->next = NULL;  //此处无效操作
 delete pS;   //因为循环最后一次,pS = new Student没有处理任何链表操作,所以要释放

 return (head);
}

void Delete(Student *head,long number)
{
 Student *p;
 if(!head)
 {
  cout<<"/nList null!/n"<<endl;
  return ;  //表示未作删除
 }

 if(head->number == number) //要删除的结点在链首,处理第一个结点
 {
  p = head;  //用p指向首地址
  head = head->next; //把head重新指向它自身的成员指针,也就是下一个结点地址
  delete p;  //释放由pS = new Student创建的内存
  cout<<number<<"the head of list have been deleted"<<endl;
  return;
 }
 //当第一个结点,没有搞定的情况下,继续遍例处理整个head,包括第一个
 for(Student *pGuard = head;  //同样,取首链结点地址
  pGuard->next;    //保证自身结点指向下一个的地址不为空
  pGuard = pGuard->next)  //把head重新指向它自身的成员指针,也就是下一个结点地址
 {
  if(pGuard->next->number == number) //在这里处理了除了第一个的余下的结点->next
  {
   p = pGuard->next; //找到指向此结点的地址,准备delete
   pGuard->next = p->next;//把后面的结点连上来
   delete p;   //删除指向这个堆的地址
   cout<<number<<"have been deleted"<<endl;
   return;
  }
 }
 cout<<number<<"not found!"<<endl;
}

void Insert(Student *head,Student *stud)
{
 if(head==NULL) //链表首地址为空,也就是把插入的结点放到此位置上
 {
  head = stud;//它将成为首链
  stud->next = NULL; //初始化它的下一个结点位置
  return;
 }
 if(head->number > stud->number)  //判断第一个结点值是否大于插入的结点值,是的话,结点插入的位置在链首
 {
  stud->next = head;  //把head挂在新插入结点后
  head = stud;   //让新插入结点成为首链
  return;
 }
 //否则,就需要逐个比较大小

 for(Student *pGuard = head;//取链首地址
  pGuard->next;   //保证自身结点指向下一个的地址不为空
  pGuard = pGuard->next) //把head重新指向它自身的成员指针,也就是下一个结点地址
 {
  if(pGuard->next->number >= stud->number)//当前结点的下一个结点值大于等于插入结点值
  {
   Student *p = pGuard;  //保存当前结点地址,因为下面需要把后面的挂在它的下面
   stud->next = pGuard->next; //让新插入的结点里的成员指向下一个结点地址
   p->next = stud;    //把新加入的结点挂在最后一个小于它的后面
   return;
  }
 }
}

void ShowList(Student *head)
{
 while(head)  //判断是不是指到头为空了
 {
  cout<<head->number<<":"<<head->score<<endl;
  head = head->next;//不断的指向保存下一个结点指针的自身成员的地址
 }
}

int main(int argc, char* argv[])
{
 Student ps;
 ps.number = 36;
 ps.score = (float)3.8;
 head = Create();
 Delete(head,2);
 Insert(head,&ps);
 ShowList(head);

 return 0;
}

职场人生(十六):2013 回想这多半年走过来的路

又到总结时,这是第三个年头的总结了。 每次开学,看到学生欣喜的赶奔学校,已经毕业一年的我,看到这种情景,说不出的感觉,有怀念自己,有惋惜他们。 回顾这一年,没有写几篇思想性的博客,但也始终没有停止思考...

C#程序员,想想走过来的路啊

C# 程序员工作刚开始工作时,更多的是

职场人生(九):2012 回想这半年走过来的路

每每回首走过来的路,每每做年度总结时,都会感慨时光飞逝,然而面对这份无奈,我们可以用成长和进步来慰藉。       3.4.5月:软考 + 自考 + 停课    这半年,有一半的时间(3.4.5月份)...

职场人生(十四):回想2012走过来的路

又是一年总结,让我能够再一次静静的回想这一年发生的酸、甜、苦、辣,归功于提高班的学习环境。   一月 传说中的合作开发。这个寒假开始了合作开发,在项目技术上,进入了合作时代。平时生活中也不乏合作机会,...

总有一种幸福会走过来

【被打扫得干干净净的走廊】因为工作的关系,我跟妈妈彻底吵崩了,赌气从家里搬出来,一个人在火车站附近租了一间简陋的单人间。长沙火车站一向都是鱼龙混杂的地方,我租的房子在十一楼,是顶楼,楼下住的是只有夜间...

Python 学习历程- 看我一步一步走过来 未完待续。。。

python 学习历程,一步一步详解学习一门编程语言之关键。

回头看看她的日记, 我哭了。 我曾经说过她从来不知道对我好,现在我知道了,她都藏在心里

他 幸亏有他的照顾 要不我更受不了这一切的一切 他我的老公对我还挺好  就是现在刚找了一份工作也挺辛苦的  天天加班到很晚才回家  那我自己在家也没意思 也挺无聊的  也是没有办法  所以我坚持  ...

数据库支持下的MFC程序

  • 2015年01月29日 20:11
  • 58.93MB
  • 下载

列表下拉/上拉刷新:(二)支持下拉/上拉的ViewController基类

目标:定义包含tableView的rootViewController类,其它需要此功能的ViewController可以直接继承,通过重载开始刷新数据的函数,执行自己实际的刷新和加载操作,其他关于f...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在STL/MFC里的链表类强大支持下,回头看看曾经走过来的路...(原创)
举报原因:
原因补充:

(最多只允许输入30个字)