1、 j+) num += arrj;if(num = t)count+;for(int k = c; k k+)num -= arrk - c;num += arrk; 3.结构体定义的使用1)struct nodeint num;struct node *next;此时定义node结构体变量时,必须写成struct node *nod;2)typedef struct nodenode;此时定义node结构体变量时,可以写成node *nod;同时必须注意后面必须加上冒号,这是一个语句。二、字符串处理1.字符串的定义:1)char str1 = HelloWorld;/ 通过字符数组来定义字符
2、串,其实包含两个存储空间:1.首先是在栈去分配了一段存储空间,用来存储字符串;2.同时此常量字符串存储在静态数据区。2)char *str2 = / 通过字符指针来定义字符串,其也包含两个存储空间:1.首先是在栈上为指针分配存储空间,用来存放指针变量;2.同时常量字符串存储在静态数据区。3)#define str3 / 通过宏定义来定义字符串,等价于str3=2.字符串的输入:1)常规字串输入:采用scanf()函数实现输入操作:必须要取地址,将字符串存入地址中;其不能识别空格,tab等按键。2)带空格的字串输入采用gets()函数实现输入操作:可以识别空格和tab等按键;其变量只要是地址名字
3、即可,不要写成取地址的方式;由于scanf()输入字符串时默认空格作为结束符,故要输入带有空格的字符串时,采用以下格式:scanf(%n,str)。3.字符串的输出:1)常规字串输出printf(%s,ai);它的输出是从a中第i号字符开始输出,直到字符串结束符0输出结束。2)固定长度字串输出:须知字串长度,采用循环输出3)带空格字串输出:4.字符串作为参数传递:1)传递的是地址,数组也是一样,传递的是地址;2)对于结构体变量而言,要操作结构内部变量,必须根据地址来操作;3)操作数的位数最大为64位,故要实现结构体的单位操作,必须重新编写操作函数。5.字符串函数的使用:字符串函数大全见:附录1
4、:字符串函数大全1)将字符串转换成数值;实现方式一double atoi(int n,char* str)int len=n;double num=0;/定义变量时,一定要初始化for(int i=0;i0)ai+=m%10+m/=10;return a;char b11=0123456789int i=0;%d,&m);ai+=bm%10;6.字符串数组的操作在C+中string可以直接当做变量来处理;可以通过new stringn来申请器长度;3对于string字符串的传递可以跟变量的传递一样操作;4具体实现如下:int stringPrint(int num,const string s
5、tr)for(int i = 0; num;cout stri p = new stringnum; pi;stringPrint(num,p);delete p;/ 对于申请的连续地址空间释放时一定要注意三、数据结构1.数组1)数组定义:数组定义时,必须指定大小,从而编译器为其分配固定大小的内存空间,内存连续分配;2)数组初始化:最好为其初始化,如果没有初始化,其会保存垃圾数据;3)数组的输入:数组实现数据输入时,一般采用循环输入;4)数组的输出:输出一般也采用循环输出;5)数组作为参数传递:数组做参数,无法按值传递。这是由C/C+函数的实现机制决定的。传数组给一个函数,数组类型自动转换为指
6、针类型,因而传的实际是地址,因此对其进行操作时,可以对数组值进行修改。所以为了避免数组值的修改,应该使用const固定。下面三种函数声明完全等同:void func(const int array10)void func(const int array)void func(const int *array)2.链表1)定义:一种物理存储单元上非连续、非顺序的存储结构。2)优势:不定长,可以根据数据存储需要,不断添加和删除;存储空间不用连续。3)链表的一般操作:1)链表的创建:a.创建一个新节点nodenod=(node*)malloc(sizeof(node);nod-val=val;next
7、=NULL;/* 判断内存分配是否为空 */if(nod=NULL)b.头指针head,用于对单向链表的遍历,该地址指向链表的头部if(head=NULL)head=nod;c.位置指针p,保存指针位置p-next=nod;p=nod;2)链表的插入:a.对于单向链表,先从头开始遍历,找到要操作节点的前一个节点node* listInsert(node* head,int k)int i=2;node* p=NULL;node* nod=NULL;p=head;/* 输入查询节点数必须大于0 */if(knext;next=p-p-next=nod;3)链表的删除:node* listDele
8、te(node* head,int k)node* q=NULL;head=nod-free(p);/* 开始查询要删除的节点的前一个节点 */q=p-next=q-free(q);4)链表的打印:int listPrint(node* head)while(head!=NULL)%x-%d,head,head-val);head=head-5)链表的逆序打印递归实现int printList1(Node* head)if(head != NULL)if(head-next !printList1(head-next); head-val -0x head 堆栈实现int printList2
9、(Node* head)stack st;while(head !st.push(head);head = head-while(!st.empty() st.top()- st.top() head-next = prev;prev = head;head = next; return prev;4.要及时释放内存空间,malloc()和free()两个函数要配合使用。3.栈先进后出,限定只能在表的一端进行插入和删除操作的线性表;2)线性表分类:顺序线性表 (也就是用数组实现的,在内存中顺序排列,通过改变数组序号来实现压栈和出栈)a.定义一个结构体,保存栈的基本信息typedef struc
10、t sqStackint size;int* sp;int* top;sqStack;b.栈初始化,定义栈的大小和指针int stackInit(sqStack s)s-top=(int*)malloc(sizeof(int)*n);sp=s-top;c.压栈int push(sqStack* s,int val)sp+;d.出栈int pop(sqStack* s)int val=0;sp-;val=s-val;return val;链表 (主要是对链表表头进行操作)a.定义一个结构体,作为栈的节点int val;struct sqStack* next;b.栈初始化sqStack* sta
11、ckInit()sqStack* s;return s;sqStack* push(sqStack* s,int val)sqStack* nod=NULL;nod=(sqStack*)malloc(sizeof(sqStack);next=s;s=nod;sqStack* pop(sqStack* s)nod=s;s=s-free(nod);栈的实现:可以采用两种方式,可以分别采用顺序表或者链表实现。应用:a.四则运算b.符号检测4.队列先进先出,限定只能在表的一端进行插入和在另一端进行删除操作的线性表;2)队列的实现:3)应用:5.二叉树1)基本概念:定义:每个结点最多有两棵子树,左子树和
12、右子树,次序不可以颠倒性质:a.非空二叉树的第n层上至多有2(n-1)个元素b.深度为h的二叉树至多有2h-1个结点其他概念:a.满二叉树:b.完全二叉树:2)存储结构顺序存储:将数据结构存在一块固定的数组中#define LENGTH 100 typedef char datatype;typedef struct node datatype data;int lchild,rchild;int parent;Node;Node treeLENGTH;int length;int root;链式存储:typedef struct BinNodestruct BinNode* lchild;s
13、truct BinNode* rchild;BinNode;typedef BinNode* bintree;/bintree本身是个指向结点的指针3)二叉树的遍历前序遍历:根节点-左子树-右子树中序遍历:后序遍历:右子树-根节点4)遍历的实现二叉树的创建a.创建二叉树节点typedef struct BiTreechar chr;struct BiTree* lchild;struct BiTree* rchild;BiTree;b.创建二叉树BiTree* CreateBiTree()BiTree* T=NULL;%cchr);if(chr!= T=(BiTree*)malloc(size
14、of(BiTree);if(T=NULL)Memory is failed!n);T-chr=chr;lchild=CreateBiTree();rchild=CreateBiTree();return T;前序遍历int preOlderTraverse(BiTree* T)if(T),T-preOlderTraverse(T-lchild);rchild);中序遍历int inOlderTraverse(BiTree* T)inOlderTraverse(T-后序遍历int postOlderTraverse(BiTree* T)postOlderTraverse(T-非递归实现创建堆栈a
15、.创建节点BiTree* Bt;struct sqStack* sp;b.push()函数实现int push(sqStack* S,BiTree* Bt)sqStack* Stack=NULL;Stack=(sqStack*)malloc(sizeof(sqStack);if(Stack=NULL)Stack-Bt=Bt;Bt-lchild=Bt-lchild;rchild=Bt-rchild;sp=(*S);(*S)=Stack;c.pop()函数实现BiTree* pop(sqStack* S)BiTree* Bt=NULL;Bt=(*S)-Bt;Stack=(*S);(*S)=(*S)-sp;free(Stack);return Bt;#Memroy is failed!int preOlderVisitBiTree(sqStack* S,BiTree* T)if(!T)The BiTree is empty!while(T|S)while(T)push(&S,T);T=T-T=pop(&S);int inOlderVisitBiTree(sqStack* S,BiTree* T)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1