C/C++基础必备,数据结构描述必备
2012-06-27 23:02
471 查看
/*
头指针与头结点
C++ VS2010编译环境
*/
#include<iostream>
using namespace std;
typedef struct node{
int data;
struct node *next;
}list_node;
int main(){
list_node *node1 = NULL;
list_node *node2 = NULL;
node1 = new list_node;//注意在C编译环境下是不能这么用的
node1->data = 1;//为数据域赋值
node1->next = NULL;//指针初始化一定要置空处理
node2 = new list_node;
node2->data = 2;
node2->next = NULL;
node1->next = node2;//将node1、node2链接
list_node *head_pointer;
head_pointer = node1;//将头指针指向链表第一个结点
list_node *head_node;
head_node = new list_node;
head_node ->data = -1;
head_node ->next = NULL;//初始化头结点,并置空处理
head_node ->next = node1;
//添加几个结点测试
list_node *node3 = new list_node;
node3->data = 3;
node2->next = node3;
list_node *node4 = new list_node;
node4->data = 4;
node3->next = node4;
//此处一定要注意将最后一个结点置空处理
node4->next = NULL;
int i=1;
//输出看看
while(head_pointer){//考研的书上经常这么写,我一开始根本看不懂,后来知道
//它就是head_pointer!=NULL的意思
cout<<"第"<<i<<"个结点数据域为:"<<head_pointer->data<<endl;
i++;//指示器自增
//用头指针来向下循环
head_pointer = head_pointer ->next;
}
return 0;
}
===============================================================================
/*
LinkList与LNode
*/
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;//此处我困惑了n久,LNode和*LinkList都是struct LNode的别名,为什么会这样,因为C
//语言的历史遗留问题,在C中需要使用struct LNode来定义新的指针,C++中为了简化操作可以直接使用它的别名
int main(){
LNode *node1 = new LNode;
node1->data = 1;
node1->next = NULL;
//此处可以证明node2和node1是一样的
//实例化node2的时候可以这样使用
LinkList node2 = new LNode;
node2->data = 2;
node2->next = NULL;
struct LNode *node3 = NULL;
node3 = new LNode;
node3->next = NULL;
node3->data = 3;
//可以输出看看
cout<<"node1->data="<<node1->data<<endl;
cout<<"node2->data="<<node2->data<<endl;
cout<<"node3->data="<<node3->data<<endl;
}
==========================================================================
/*
如果你读数据结构代码的话,经常发现&符号,这个符号表示引用符
*/
#include<iostream>
using namespace std;
void fun(int &x,int y){
x = 100;
y = 100;
}
int main(){
int a = 200;
int b = 200;
fun(a,b);
printf("a=%d ; b=%d\n",a,b);
//注意了,a的值改变了,而b的值没改变,说明x引用了a的值,x变a变
return 0;
}
===========================================================================
/*
地址和指针,指向指针的指针
*/
#include<iostream>
using namespace std;
int main(){
int a = 1;
int *p;
p = &a;
//由此可以看出来&是取地址符
printf("a=%d \n&a=%d\n",a,&a);
//由此可以看出*p就是a的值,而p储存的就是变量a的地址
printf("*p=%d \np=%d\n",*p,p);
//看下面更复杂点的,一点一点分析
int **q;//指向指针的指针,开始有人晕了哦
q = &p;
//p是一个指针,那么这个指针本身的地址是多少呢?此处我们就可以用q来获取*p的地址
//q既然是获取*p的地址,那么*q是干嘛的?*q就是用来获取*p指向的那个变量的地址
//可以这么说*q和p的值是一样的,同理**q和*p的值是一样的,而*p和a的值是一样的
printf("q=%d \n*q=%d \n**q=%d\n",q,(*q),(**q));
return 0;
}
==========================================================================
/*
在函数中用指针接收
*/
#include<iostream>
using namespace std;
void fun(int *x,int y){
*x = 100;
y = 100;
}
int main(){
int a = 200;
int b = 200;
int *p;
p = &a;
//传递给函数的第一个参数的实际值是p的值,也就是a的地址,那么函数执行过程中x的值是a的地址
//所以修改*x实际上就是修改a的地址所存放的值,就是相当于修改了变量a的值
fun(p,b);
printf("a=%d \nb=%d",a,b);
return 0;
}
=======================================================================================
/*
看完这个,数据结构再读起来就忒容易了
动态分配内存,define,强制类型转换,顺序表存储结构,顺序表与数组,链表结点内存分配,指针细节
*/
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100//预定义,不多说了
#define ElemType int//可以将int换为其他任何合法类型
typedef struct {
ElemType *elem;
ElemType length;
ElemType listsize;
}SqList;
int main(){
SqList L;
//sizeof()获取某一类型所占的字节数
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//当我们使用int a[100];来定义一个数组时,系统分配100*sizeof(int)的连续内存空间,并把首地址赋给a,
//此时我们可以把a当作一个指针来使用,我们使用a[0]和*a的效果是一样,而a[1]和*(a+1)是一样的。
int a[10];//静态分配
int *a_Dy;//动态分配
a_Dy = (int*)malloc(sizeof(int)*10);//首地址赋给a_Dy,内存一旦分配,大小不可改变
}
==================================================================================
//数组的最后一个例子,证明数组名a可以作为指针来用
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
printf("%d %d\n",sizeof(int),sizeof(double));
int a[10];
a[0] = 90;
printf("*a=%d\n",*a);//就是第一个元素
printf("%d\n",a+1);
printf("%d\n",a);
printf("%d\n",&a[1]-&a[0]);
printf("%d\n",(int)&a[1]-(int)&a[0]);
double b[10];
b[0]=100;
//cout<<"*b="<<*b<<endl;
printf("*b=%f\n",*b);
printf("%d\n",b+1);
printf("%d\n",b);
printf("%d\n",&b[1]-&b[0]);
printf("%d\n",(int)&b[1]-(int)&b[0]);
return 0;
}
1、//看了点数据结构,发现自己的C++太垃圾,同时没学过C,所以现在提醒看数据结构的最好先把C看完,否则读代码相当费力,另外王道论坛考研系列错误比较多,不建议购买
//在C语言中,我一直想把模板和结构体结合起来使用,但是弄了半天总是有编译错误,发现网上也是,结构体最好不要搭配模板使用,必要的话可以使用预定义
#define ElemType int //或者 typedef int ElemType;
typedef struct BSTNode{
ElemType data;//数据域
struct BSTNode *lchild,*rchild;//左指针,右指针
}BSTNode,*bst;//bst是类型名
//可以这样用,效果一样
bst b = (bst)malloc(sizeof(bst));
BSTNode* bb = (BSTNode*)malloc(sizeof(BSTNode));
b->data = 10;
bb->data = 20;
2、//说明引用方式
如果你在声明的时候使用这种形式:struct BSTNode node;然后在引用data和next的时候,要使用node.data和node.next,并且不需要使用malloc来申请内存。
如果是这种:BSTNode *node = (BSTNode*)malloc(sizeof(BSTNode));要使用这种形式来引用:node->data和node->lchild;因为在声明的时候加“*”,即表示是指针类型,所以需要使用“->”
注意点:C中需要在函数开头的地方进行声明,然后使用。const int a是声明,所以要放在所有的赋值语句的前面。切记。
3、C编译环境
#include<stdio.h>
typedef struct listnode{//listnode是结构体类型名
int data;
struct listnode *next;
}node;//node是类型名,相当于struct listnode,可以把node看成是struct listnode的别名
此处使用了typedef所以node变成了类型名,可以直接声明对象进行使用
在使用的时候,struct listnode 相当于node
int main(){
node test;//或者struct listnode test;
test.data = 8;
printf("test.data=%d\n",test.data);
return 0;
}
=======================================
#include<stdio.h>
typedef struct test{
int data;
struct listnode *next;
}node;//node 是结构体类型的别名
int main(){
//1、处
//struct test test1;
//test1.data = 80;
//printf("test1.data=%d\n",test1.data);
node n ;
n.data = 90;
printf("n.data=%d\n",n.data);//说明,此处不能和上面的1处同时使用,否则编译错误,至于为什么,我也不晓得,晓得的人可以告诉我
return 0;
}
=========================================
4、C编译环境
struct 结构体名{
成员表列
}变量名表列;
#include<stdio.h>
struct listnode{//listnode是结构体类型名,注意此处没有typedef关键字
int data;
struct listnode *next;
}node;//node变量名
//此处没有用了typedef所以node变成了变量名
int main(){
node.data = 8;
printf("node.data=%d\n",node.data);
return 0;
}
===========================================
#include<stdio.h>
struct test{
int data;
struct listnode *next;
}node;//node变量名
//此处没有用了typedef所以node变成了变量名
int main(){
struct test test1;//使用结构体定义变量的时候,必须带struct关键字
test1.data = 89;
printf("test1.data=%d\n",test1.data);
node.data = 8;
printf("node.data=%d\n",node.data);
return 0;
}
5、typedef关键字:是一种在计算机编程语言中用来声明自定义数据类型。用来声明定义一个结构体,可以较好地体现程序的模块化结构,使程序更加的美观,具有更强的可读性
struct关键字:在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
6、不带变量的结构说明不占存储空间,结构类型集中放到一个文件中,需要时使用#include
说明:以后只维护更新CSDN的博客,其他各个论坛网站的博客将逐步放弃,因为没那么多时间
个人空间博客:http://blog.csdn.net/shijiebei2009
有任何问题均可到博客留言
头指针与头结点
C++ VS2010编译环境
*/
#include<iostream>
using namespace std;
typedef struct node{
int data;
struct node *next;
}list_node;
int main(){
list_node *node1 = NULL;
list_node *node2 = NULL;
node1 = new list_node;//注意在C编译环境下是不能这么用的
node1->data = 1;//为数据域赋值
node1->next = NULL;//指针初始化一定要置空处理
node2 = new list_node;
node2->data = 2;
node2->next = NULL;
node1->next = node2;//将node1、node2链接
list_node *head_pointer;
head_pointer = node1;//将头指针指向链表第一个结点
list_node *head_node;
head_node = new list_node;
head_node ->data = -1;
head_node ->next = NULL;//初始化头结点,并置空处理
head_node ->next = node1;
//添加几个结点测试
list_node *node3 = new list_node;
node3->data = 3;
node2->next = node3;
list_node *node4 = new list_node;
node4->data = 4;
node3->next = node4;
//此处一定要注意将最后一个结点置空处理
node4->next = NULL;
int i=1;
//输出看看
while(head_pointer){//考研的书上经常这么写,我一开始根本看不懂,后来知道
//它就是head_pointer!=NULL的意思
cout<<"第"<<i<<"个结点数据域为:"<<head_pointer->data<<endl;
i++;//指示器自增
//用头指针来向下循环
head_pointer = head_pointer ->next;
}
return 0;
}
===============================================================================
/*
LinkList与LNode
*/
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;//此处我困惑了n久,LNode和*LinkList都是struct LNode的别名,为什么会这样,因为C
//语言的历史遗留问题,在C中需要使用struct LNode来定义新的指针,C++中为了简化操作可以直接使用它的别名
int main(){
LNode *node1 = new LNode;
node1->data = 1;
node1->next = NULL;
//此处可以证明node2和node1是一样的
//实例化node2的时候可以这样使用
LinkList node2 = new LNode;
node2->data = 2;
node2->next = NULL;
struct LNode *node3 = NULL;
node3 = new LNode;
node3->next = NULL;
node3->data = 3;
//可以输出看看
cout<<"node1->data="<<node1->data<<endl;
cout<<"node2->data="<<node2->data<<endl;
cout<<"node3->data="<<node3->data<<endl;
}
==========================================================================
/*
如果你读数据结构代码的话,经常发现&符号,这个符号表示引用符
*/
#include<iostream>
using namespace std;
void fun(int &x,int y){
x = 100;
y = 100;
}
int main(){
int a = 200;
int b = 200;
fun(a,b);
printf("a=%d ; b=%d\n",a,b);
//注意了,a的值改变了,而b的值没改变,说明x引用了a的值,x变a变
return 0;
}
===========================================================================
/*
地址和指针,指向指针的指针
*/
#include<iostream>
using namespace std;
int main(){
int a = 1;
int *p;
p = &a;
//由此可以看出来&是取地址符
printf("a=%d \n&a=%d\n",a,&a);
//由此可以看出*p就是a的值,而p储存的就是变量a的地址
printf("*p=%d \np=%d\n",*p,p);
//看下面更复杂点的,一点一点分析
int **q;//指向指针的指针,开始有人晕了哦
q = &p;
//p是一个指针,那么这个指针本身的地址是多少呢?此处我们就可以用q来获取*p的地址
//q既然是获取*p的地址,那么*q是干嘛的?*q就是用来获取*p指向的那个变量的地址
//可以这么说*q和p的值是一样的,同理**q和*p的值是一样的,而*p和a的值是一样的
printf("q=%d \n*q=%d \n**q=%d\n",q,(*q),(**q));
return 0;
}
==========================================================================
/*
在函数中用指针接收
*/
#include<iostream>
using namespace std;
void fun(int *x,int y){
*x = 100;
y = 100;
}
int main(){
int a = 200;
int b = 200;
int *p;
p = &a;
//传递给函数的第一个参数的实际值是p的值,也就是a的地址,那么函数执行过程中x的值是a的地址
//所以修改*x实际上就是修改a的地址所存放的值,就是相当于修改了变量a的值
fun(p,b);
printf("a=%d \nb=%d",a,b);
return 0;
}
=======================================================================================
/*
看完这个,数据结构再读起来就忒容易了
动态分配内存,define,强制类型转换,顺序表存储结构,顺序表与数组,链表结点内存分配,指针细节
*/
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100//预定义,不多说了
#define ElemType int//可以将int换为其他任何合法类型
typedef struct {
ElemType *elem;
ElemType length;
ElemType listsize;
}SqList;
int main(){
SqList L;
//sizeof()获取某一类型所占的字节数
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//当我们使用int a[100];来定义一个数组时,系统分配100*sizeof(int)的连续内存空间,并把首地址赋给a,
//此时我们可以把a当作一个指针来使用,我们使用a[0]和*a的效果是一样,而a[1]和*(a+1)是一样的。
int a[10];//静态分配
int *a_Dy;//动态分配
a_Dy = (int*)malloc(sizeof(int)*10);//首地址赋给a_Dy,内存一旦分配,大小不可改变
}
==================================================================================
//数组的最后一个例子,证明数组名a可以作为指针来用
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
printf("%d %d\n",sizeof(int),sizeof(double));
int a[10];
a[0] = 90;
printf("*a=%d\n",*a);//就是第一个元素
printf("%d\n",a+1);
printf("%d\n",a);
printf("%d\n",&a[1]-&a[0]);
printf("%d\n",(int)&a[1]-(int)&a[0]);
double b[10];
b[0]=100;
//cout<<"*b="<<*b<<endl;
printf("*b=%f\n",*b);
printf("%d\n",b+1);
printf("%d\n",b);
printf("%d\n",&b[1]-&b[0]);
printf("%d\n",(int)&b[1]-(int)&b[0]);
return 0;
}
1、//看了点数据结构,发现自己的C++太垃圾,同时没学过C,所以现在提醒看数据结构的最好先把C看完,否则读代码相当费力,另外王道论坛考研系列错误比较多,不建议购买
//在C语言中,我一直想把模板和结构体结合起来使用,但是弄了半天总是有编译错误,发现网上也是,结构体最好不要搭配模板使用,必要的话可以使用预定义
#define ElemType int //或者 typedef int ElemType;
typedef struct BSTNode{
ElemType data;//数据域
struct BSTNode *lchild,*rchild;//左指针,右指针
}BSTNode,*bst;//bst是类型名
//可以这样用,效果一样
bst b = (bst)malloc(sizeof(bst));
BSTNode* bb = (BSTNode*)malloc(sizeof(BSTNode));
b->data = 10;
bb->data = 20;
2、//说明引用方式
如果你在声明的时候使用这种形式:struct BSTNode node;然后在引用data和next的时候,要使用node.data和node.next,并且不需要使用malloc来申请内存。
如果是这种:BSTNode *node = (BSTNode*)malloc(sizeof(BSTNode));要使用这种形式来引用:node->data和node->lchild;因为在声明的时候加“*”,即表示是指针类型,所以需要使用“->”
注意点:C中需要在函数开头的地方进行声明,然后使用。const int a是声明,所以要放在所有的赋值语句的前面。切记。
3、C编译环境
#include<stdio.h>
typedef struct listnode{//listnode是结构体类型名
int data;
struct listnode *next;
}node;//node是类型名,相当于struct listnode,可以把node看成是struct listnode的别名
此处使用了typedef所以node变成了类型名,可以直接声明对象进行使用
在使用的时候,struct listnode 相当于node
int main(){
node test;//或者struct listnode test;
test.data = 8;
printf("test.data=%d\n",test.data);
return 0;
}
=======================================
#include<stdio.h>
typedef struct test{
int data;
struct listnode *next;
}node;//node 是结构体类型的别名
int main(){
//1、处
//struct test test1;
//test1.data = 80;
//printf("test1.data=%d\n",test1.data);
node n ;
n.data = 90;
printf("n.data=%d\n",n.data);//说明,此处不能和上面的1处同时使用,否则编译错误,至于为什么,我也不晓得,晓得的人可以告诉我
return 0;
}
=========================================
4、C编译环境
struct 结构体名{
成员表列
}变量名表列;
#include<stdio.h>
struct listnode{//listnode是结构体类型名,注意此处没有typedef关键字
int data;
struct listnode *next;
}node;//node变量名
//此处没有用了typedef所以node变成了变量名
int main(){
node.data = 8;
printf("node.data=%d\n",node.data);
return 0;
}
===========================================
#include<stdio.h>
struct test{
int data;
struct listnode *next;
}node;//node变量名
//此处没有用了typedef所以node变成了变量名
int main(){
struct test test1;//使用结构体定义变量的时候,必须带struct关键字
test1.data = 89;
printf("test1.data=%d\n",test1.data);
node.data = 8;
printf("node.data=%d\n",node.data);
return 0;
}
5、typedef关键字:是一种在计算机编程语言中用来声明自定义数据类型。用来声明定义一个结构体,可以较好地体现程序的模块化结构,使程序更加的美观,具有更强的可读性
struct关键字:在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
6、不带变量的结构说明不占存储空间,结构类型集中放到一个文件中,需要时使用#include
说明:以后只维护更新CSDN的博客,其他各个论坛网站的博客将逐步放弃,因为没那么多时间
个人空间博客:http://blog.csdn.net/shijiebei2009
有任何问题均可到博客留言
相关文章推荐
- 数据结构、算法与应用 (C++描述) 第二版 1.15
- 数据结构、算法与应用 (C++描述) 第二版 1.16
- C++基础-基础数据结构-stack
- 数据结构-C++描述:动态创建和释放一个二维数组
- 数据结构、算法与应用 (C++描述) 第二版 1.14
- 算法与数据结构基础 -- 排序 (C++实现)
- 数据结构、算法与应用 (C++描述) 第二版 1.1
- 数据结构、算法与应用(C++描述) 第二版 1.7
- c++基础8:常用的数据结构及算法
- 数据结构-栈的一些基础操作c++代码
- 数据结构_演练c++的基础,我师兄要求我做的。。
- 数据结构、算法与应用 (C++描述) 第二版 1.4
- 数据结构 JAVA描述(四) 树与二叉树基础
- 数据结构、算法与应用(C++描述)阅读记录
- 数据结构、算法与应用 (C++描述) 第二版 1.25
- 数据结构-线性表的一些基础操作 c++代码
- 数据结构、算法与应用 (C++描述) 第二版 1.8
- 数据结构、算法与应用 (C++描述) 第二版 1.18
- 数据结构、算法与应用 (C++描述) 第二版 1.19
- 数据结构:Binary and other trees(数据结构,算法及应用(C++叙事描述语言)文章8章)