在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;
}

MFC链表CList类

一、类的概要和头文件 1. CList类:产生不定类型的列表,是一个集合类,也是一个双向链表类,是一个类模板。 2. #include "Afxtempl.h"   //包含头文件 ...
  • liujiayu2
  • liujiayu2
  • 2015年05月28日 13:15
  • 2470

MFC链表类解读

围绕微软提供的collect示例代码进行说明。可在X:/Microsoft Visual Studio 9.0/Samples/2052/C++/MFC/advanced/collect下找到该程序。...
  • zxxSsdsd
  • zxxSsdsd
  • 2015年09月21日 10:59
  • 827

C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和具体的应用实现(STL),本文是系列总结的第二篇,主要针对线性表中的链表 S...
  • LG1259156776
  • LG1259156776
  • 2015年07月23日 15:36
  • 6001

STL list链表的用法详细解析

原文地址:http://www.jb51.net/article/41525.htm 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂。不失为S...
  • Double2hao
  • Double2hao
  • 2016年03月01日 08:05
  • 3082

STL中的链表

详细讲解可参考博主原来   1.头文件 2.如何创建链表    list l 3.如何历遍链表&&迭代器   迭代器的定义   list::iterator  it; for(it =...
  • bujuan827
  • bujuan827
  • 2016年09月03日 08:56
  • 162

SGI-STL内存池实现及简单使用

这篇博客主要讲一下SGI-STL中的空间配置器的工作流程。我自己实现模仿STL实现了一个空间配置器,并且用两个容器list和vector测试使用了空间配置器。这里只给出模型,如果要看源码,请到http...
  • Chengzi_comm
  • Chengzi_comm
  • 2016年08月15日 12:51
  • 1611

STL链表之删除指定元素(list)

链表-删除指定元素 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述        对于一个给定的线性表,要求...
  • qq_16255321
  • qq_16255321
  • 2014年06月19日 17:09
  • 1291

STL链表之插入元素(list)

师 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给出一个只有头指针的链表和 n 次操作,每次操作为在链表...
  • qq_16255321
  • qq_16255321
  • 2014年06月28日 22:02
  • 1024

给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。

样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 解题思路:统计出链表的长度,然后就很简单了 ...
  • u013289254
  • u013289254
  • 2017年03月01日 21:44
  • 718

STL list(链表)自定义结构体实现排序

#include #include using namespace std; class A{ public:  int a,b;  A(int t1,int t2){a=t1,b=t...
  • qq632544991p
  • qq632544991p
  • 2016年03月03日 14:34
  • 533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在STL/MFC里的链表类强大支持下,回头看看曾经走过来的路...(原创)
举报原因:
原因补充:

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