C++简单学习一下——C++动态数据结构链表的创建与使用_C++结构体struct_C++共用体union_C++枚举enum_C++类型别名typedef

文章目录:

1.c++结构体struct

1.1 存储不同类型的数据项,把不同类型的数据结合合成一个整体用来描述某一对象

1.2 struct 语句定义了一个包含多个成员的新的数据类型

1.3 结构体必须先定义类型,后定义它的变量

1.4 结构体大小(Bytes)用sizeof查看

1.5 结构体变量的初始化:定义变量时赋值

1.6 访问结构体的变量用“.”或者"->"

1.7 结构体数组及其初始化

1.8 结构体指针

1.9 结构体作为函数参数

2.c++共用体union

2.5 给union的某个成员赋值后,该union的其他成员就变成未定义状态

2.6 同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数

2.7 C++中union类型定义后使用时可以省去union

2.8 共用体变量的初始化

2.9  定义共用体及定义该数据变量

2.10共用体和结构体的区别

3.c++枚举enum

3.1 枚举类型:有限个整型符号常量枚举常量的集合

3.2 用途与定义:若某变量只能取有限几个整数值,把他们一一列举出来定义为枚举类型(限定变量的取值)

3.3 枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。符号常量是整数值,它本身不是字符串

3.4 绝大多数程序员都会釆用枚举数据类型名字首字母大写的形式

3.5 定义类型时:可指定每个枚举常量的整数值

3.6 为枚举符号赋值,则它们必须是整数

3.7 虽然没有要求按升序排列赋给的整数值,但一般默认是这样

3.8 因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用

4.c++类型别名typedef

4.1 给已定义的类型取一个别名

4.2 结构体结合别名

4.3 精简长类型名,简化C++构体变量的定义,用 typedef 定义别名

4.4 定义指针

4.5 为较复杂的定义/声明定义简单的别名

5.c++动态数据结构链表

5.1 什么是链表

5.2 什么是动态数据结构

5.3 链表的形成方式

5.4 简单链表的形成

5.5 如何用C/C++语言创建结点和简单链表(不适用)

5.6 C/C++中的动态分配内存的方法

5.7 实用链表的构造方法(适用)

5.8 数据域、指针域

5.9 Head、pnew、pend

5.10 单链表的建立过程

第一步:建立第1个结点

第二步:建立第2个结点

第三步:建立第3个结点

第四步:建立最后一个结点

5.11 如在A、C两结点之间插入结点B 

5.12 插入结点位置在首位之间

5.13 销毁链表


1.c++结构体struct

1.1 存储不同类型的数据项,把不同类型的数据结合合成一个整体用来描述某一对象

1.2 struct 语句定义了一个包含多个成员的新的数据类型

1.3 结构体必须先定义类型,后定义它的变量

struct  point
{  int x;   int y;  };
struct  point  pt;            // C : 定义结构体变量 pt
point  pt;                   // C++ : 可省略struct

1.4 结构体大小(Bytes)用sizeof查看

定义结构体变量:
struct  student   // 类型名 student
{
   unsigned  int ID ;
   char   name[20] ;
   bool   sex ;
   date   birthday;     // 定义结构体变量
   int      score[35] ;
} stud1, stud2 ;        // 定义2个结构体变量
//这里也可以这样定义结构体
//student stud1;
//student stud2;


student  *sp;            // 定义结构体指针
student  st1[3];       // 定义结构体数组(一维)
student  st2[3][4];  // 定义结构体数组(二维)



无名结构体类型:
struct     // 省略类型名:无名结构体
{
   unsigned  int ID ;
   char   name[20] ;
   bool   sex ;
   date   birthday;     // 定义结构体变量
   int      score[35] ;
} stud;   

1.5 结构体变量的初始化:定义变量时赋值

student  John =    // 定义变量并初始化
      { 326, "John", 0, {1992,5,15}, {85,90,80}}; 

student Joe = John; //赋值类型相同

1.6 访问结构体的变量用“.”或者"->"

Joe = John;       // 赋值
John.ID = 215;
John.birthday.year = 1990;
John.birthday.month = 8;
John.score[0]=95;
John.score[1]=85;
John.score[2]=75;

1.7 结构体数组及其初始化

struct  student   //类型名
{
   unsigned  int ID ;
   string  name ;
   bool     sex ;
   date     birthday ;
   int        score[3] ;
} stu[100];   //结构体数组



student  stu[4] =   //一维数组
{  
   101, "张三", 1, {1992,3,5}, {85,95,90},
   102, "李四", 0, {1992,6,8}, {90,87,82},
   103, "王五", 1, {1993,1,8}, {80,80,85},
   104, "赵六", 0, {1992,9,2}, {75,80,90} 
};

1.8 结构体指针

int main()
{
    struct date{int year,mouth,day};
    date day;
    *p=&day;
    cout<<"输出(年月日)"<<endl;
    cin>>day.year>>day.month>>day.day;
    cout<<"日期:"<<p->year<<"/"<<p->month<<"/"<<p->day;
    cout<<endl;
    system("pause");
    return 0;
}



void printBook( struct Books *book );
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

1.9 结构体作为函数参数

void printBook( struct Books book );
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

2.c++共用体union

2.1 共用体表示几个变量共用一个内存位置(各成员共享一段内存空间),在不同的时间保存不同的数据类型和不同长度的变量。所以一个联合变量的长度等于其成员中最长的那个成员的长度

2.2 在 union中,所有的共用体成员共用一个空间,并且只能储存其中一个成员变量的值达到节省空间的目的(还有一个节省空间的类型:位域)

2.3 共用体变量中各成员从第一个单元开始分配存储空间,所以各成员的内存地址是相同的

2.4 能够存储不同的数据类型,但只能同时存储其中的一种类型,即在任意时刻只有一个数据成员可以有值

     共用体:共用体只能存储int、long或double

     这里例举一下结构体:可以同时存储int、long和double

union uninType

{

  int fourByte;

  char oneByte[4];

};

//创建这种类型的变量
uninType Test1;
uninType Test2;

2.5 给union的某个成员赋值后,该union的其他成员就变成未定义状态

虽然共用体数据可以在同一内存空间中存放多个不同类型的成员,但在某一时刻只能存放其中的一个成员,起作用的是最后存放的成员数据,其他成员不起作用,如引用其他成员,则数据无意义。

例如,对data类型共用体变量,有以下语句:

    x.a=100; 
    strcpy(x.n,"zhangsan");  
    x.f=90.5;

则只有x.f是有效的,x.a与x.n目前数据是无意义的,因后面的赋值语句将前面共用体数据覆盖了

2.6 同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数

2.7 C++中union类型定义后使用时可以省去union

union myu liu;		// C中定义了一个liu类型的变量
myu liu;			// C++中定义了一个liu类型的变量

2.8 共用体变量的初始化

定义了共用体变量后,即可使用它。若需对共用体变量初始化,只能对它的第一个成员赋初始值。

例如:
         union data x={"zhangsan"};                       是正确的,

         union data x={"zhangsan",12,40000, 78,5};        是错误的。

2.9  定义共用体及定义该数据变量

(1)先定义共用体类型,再定义该类型数据

例如:

      union data

     {

         char n[10];

         int a;

         double f;

      };

       union data x,y[10];

(2)在定义共用体类型的同时定义该类型变量

例如:

      union data

     {

          char n[10];

          int a;

          double f;

     }x,y[10];

(3)不定义共用体类型名,直接定义共用体变量

例如:

      union

      {

          char n[10];

          int a;

          double f;

      }x,y[10];

2.10共用体和结构体的区别

      共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。

      对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。

3.c++枚举enum

3.1 枚举类型:有限个整型符号常量枚举常量的集合

3.2 用途与定义:若某变量只能取有限几个整数值,把他们一一列举出来定义为枚举类型(限定变量的取值)

                     默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推

若某变量只能取有限几个整数值,把它们一一列举出来
定义为枚举类型:限定变量的取值好风格
例如:
    enum  weekday   // 类型名
    { Sun, Mon, Tue, Wed, Thu, Fri, Sat } ;   // 枚举常量
    weekday  day ;    // 定义枚举变量day



day 取值:只能取枚举常量值之一 不能取代表的整数值!
枚举常量依次对应一个整数(0开始):0,1,2,3,4,5,6
内存存储:符号常量的整数值 各种运算

3.3 枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。符号常量是整数值,它本身不是字符串

3.4 绝大多数程序员都会釆用枚举数据类型名字首字母大写的形式

3.5 定义类型时:可指定每个枚举常量的整数值

enum Department { factory = 1, sales = 2, warehouse = 4 };

3.6 为枚举符号赋值,则它们必须是整数

以下赋值语句将产生错误:
enum Department { factory = 1.1, sales = 2.2, warehouse = 4,4 }; //错误

3.7 虽然没有要求按升序排列赋给的整数值,但一般默认是这样

enum Colors { red, orange, yellow = 9, green, blue };

在该示例中,命名常量 red 将被赋值为 0,orange 将为 1,yellow 将为 9,green 将为 10,blue 将为 11


enum Rooms { livingroom = 1, den, bedroom, kitchen };

在该示例中,livingroom 被赋值为 1,den 将为 2,bedroom 将为 3,kitchen 将为 4

3.8 因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用

4.c++类型别名typedef

4.1 给已定义的类型取一个别名

语法:typedef   已定义类型名   类型别名 ;



例如: typedef  unsigned  int  UINT ;
		UINT  x, y ;  

4.2 结构体结合别名

//第一种情况
struct MyStruct{
    int data1;
    char data2;
};
typedef struct MyStruct newtype;
newtype a, b;
 
//第二种情况
typedef struct MyStruct{
    int data1;
    char data2;
}newtype;
newtype a, b;
 
//第三种情况
typedef struct{
    int data1;
    char data2;
}newtype;
newtype a, b;

4.3 精简长类型名,简化C++构体变量的定义,用 typedef 定义别名

typedef  struct  point
{ 
   int x;   
   int y; 
 } POINT, *pPOINT;


POINT   pt ;  //变量
pPOINT p ;   //指针


struct  point
{  
    int x;  int y; 
};
typedef  struct  point  POINT, *pPOINT;

4.4 定义指针

typedef  int * pINT ;
pINT  pa, pb;  //两个int指针

4.5 为较复杂的定义/声明定义简单的别名

void (*func[2])(int *) ;     // 怎么理解?

1 理解复杂声明/定义
右左法:找到变量名,先往右、后往左看,碰到圆括号就调转方向。看完括号就跳出,继续先右后左看......
1.1 找到变量名 func,往右看[2] —— 数组 func[2]
1.2 往左看 * —— 指针:*func[2]是指针数组
1.3 跳出左边( ), 往右看(int *)——函数(形参int *) 
1.4 往左看 void —— 函数无返回值
结论:func 是函数 + 指针数组 有2个函数指针

2.类型定义:逐个用别名替换复杂声明定义的一部分
typedef  int  (*FUN[2])(int *);   //类型名 FUN

5.c++动态数据结构链表

 C++链表及其创建

5.1 什么是链表

链表是一种动态数据结构,用来处理大量同类型的数据
(注意:这些数据可作为一个整体来存储和读取)各个数据之间以特定方式前后相联接,形成链式结构

5.2 什么是动态数据结构

1.静态数据结构(数组)
	数组一旦定义,编译程序为其分配一片连续的内存空间,各元素依次存放(各元素内存地址连续)。数组长度一定(存放固定数目的元素)对数据进行删除、插入操作就非常烦琐

2.动态数据结构
	同样用于处理大量同类型数据,但各个元素所在内存地址并不一定连续(由程序随机分配)动态数据结构中的数据元素以结点的形式存在对数据的删除、插入操作非常方便

5.3 链表的形成方式

链表是由包含数据的多个结点前后连接形成的链式结构
1.结点:
	每一个结点是一小片连续的、存放了数据的内存空间,是形成链表的基本单元
2.结点的构成:
	每个结点由两方面内容组成:
	(1)数据域:
	真正要处理的数据,可以是单个基本类型的数据,也可以是多个不同类型的数据共同构成。
    (2)指针域:
	一般用来存放另一结点的首地址,即指针域是用来指向另一个结点的(或者赋值为NULL,即不指向任何结点。)

5.4 简单链表的形成

链表正是通过指针域将各个结点有机地联接成一个整体。设有A、B、C、D四个结点,按下图形成链表
注意
(1)head:设计的头部指针, 指向链表头结点
(2)NULL:尾部结点的指针域为空,不指向任何结点。
(3)前一节点的指针域存放下一结点的首地址


5.5 如何用C/C++语言创建结点和简单链表(不适用)

建立方法:用包含指针项的结构体变量来构成结点。如:
    typedef struct student
    {	
        int num;
	    char name[5];
	    float score;
	    struct student *next;
    }StuNode;//结点类型的定义


其中:
数据域
	num	 , name , score
指针域
	next(指向结构体类型的指针)构成
可用下面的方法建立简单链表:

struct student stu1,stu2,stu3,*head;

    //数据域赋值
stu1.num=1001;
stu1.name=“Zhao”;
stu1.score=99.0;
stu2.num=1002;
stu2.name=“Qian”;
stu2.score=88.0;
stu3.num=1003;
stu3.name=“Wang”
stu3.score=77.0;
head=&stu1;

    //指针域赋值以形成链表
stu1.next=&stu2;
stu2.next=&str3;
stu3.next=NULL;
用此种方法建立链表所存在的缺点:
(1)事先必须定义确定个数的结构体变量(结点数量),缺乏灵活性,想要增加结点时,就必须修改程序
(2)所有结点都自始至终占据内存,而不是动态地进行存储空间的分配
	 故上述链表构成方法在实际上很少使用

5.6 C/C++中的动态分配内存的方法

结点应该在需要时(如在现有链表中插入新结点)才建立(分配内存),被删除的结点,其所占用的内存应释放。为此必须使用C/C++语言的动态内存分配函数。


C:内存分配使用函数malloc(),例如:
		StuNode *pnew;
		pnew=(StuNode*)malloc(sizeof(StuNode));
		释放内存:free(pnew);


C++:动态分配内存使用new,例如:
		StuNode *pnew=new StuNode;
		释放内存:delete pnew;

5.7 实用链表的构造方法(适用)

typedef struct student
{	int num;
	char name[5];
	float score;
	struct student *next;
}StuNode;

StuNode *pnew=new StuNode;

5.8 数据域、指针域

5.9 Headpnew、pend

定义结点类型的指针Head,用以指向链表的头部;
定义结点类型的辅助指针pnew和pend,以完成链表的建立:
    StuNode *Head, *pnew , *pend;

5.10 单链表的建立过程

第一步:建立第1个结点

pnew=new StuNode;	//建立新结点
Head=pnew;	        //头指针指向第1个结点
pend=pnew;        	//辅助指针,指向当前表尾

第二步:建立第2个结点

(1)pnew=new StuNode;
(2)pend->next=pnew;
(3)pend=pnew;	//pend指向尾结点

第三步:建立第3个结点

(1)pnew=new StuNode;
(2)pend->next=pnew;
(3)pend=pnew;	//pend又指向尾部结点

第四步:建立最后一个结点

(1)pnew=new StuNode;
(2)pend->next=pnew;
(3)pend=pnew;
(4)pend->next=NULL

5.11 如在A、C两结点之间插入结点B 

执行:pb->next=pa->next;
执行:pa->next=pb;

5.12 插入结点位置在首位之间

两个辅助指针ps与pe相邻,从链表头部开始,移动到应该插入结点的地方再执行插入操作


//关键执行语句
    ps=Head; 
    pe=ps->next;
    while(pe->num<pnew->num)
    {	
        ps=ps->next; 
        pe=pe->next;	
    }
        pnew->next=pe; 
        ps->next=pnew;

5.13 销毁链表

用于销毁链表(delete Nodes one by one)
StuNode *DestroyList(StuNode *Head)
{	StuNode *pt;
	do
	{	pt=Head;
		Head=Head->next;
		delete pt;
	}while(Head);
	return Head;

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘鑫磊up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值