1.指针:指针的实质就是地址。
2.指针变量;变量在编译的时候系统要为它分配一个地址,如用另一个变量来存放这个地址,那么这个变量就叫指向变量的指针地址
指针变量就是用来存放指正的变量,他的值是另一个变量的地址。
例:
int *p;//指向整形变量的指针,用来存放整形变量的地址。
int a[5];int *q = a;//指向数组第0个元素的指针变量,a代表的是第0个元素的起始地址。
char *string = "hello";//指向字符串的指针变量,string 是一个指针变量,用来存放字符串的首地址
int(*foo)(int x,int y);//指向函数的指针变量
3.struct
通过普通的数据类型组合成新的自定义的数据类型。
struct Pixel{
unsigned char Red;
unsigned char Green;
unsigned char Blue;
}
声明方法:struct + 结构体名
struct Pixel Pixel1,Pixel2;
4.使用typedef struct
typedef struct {
unsigned char Red;
unsigned char Green;
unsigned char Blue;
}Pixel;
Pixel pixel1,pixel2;//可以不用使用struct声明
5.设计一个递归算法,删除不带头结点的单链表L中所有值为x 的结点
#include <iostream>
#include <stdlib.h>
#include <stdio.h>using namespace std;
//设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
typedef struct Lnode{
int data;
struct Lnode *next;//定义LinkList类型的指针变量,指向LinkList类型的数据}Lnode,*LinkList;//Lnode数据类型,就像定义普通数据类型一样
//定义LinkList类型的指针变量,指向LinkList类型的数据
void init_LinkList(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(Lnode));
Lnode *r = L,*p;
cout<<"请输入数据(-1退出):";
cin>>x;
while(x != -1){
p = (Lnode*)malloc(sizeof(Lnode));
p->data = x;
p->next = NULL;
r->next = p;
cout<<p->data<<" "<<p<<" "<<p->next<<endl;
r = p;
cout<<"请输入数据(-1退出):";
cin>>x;
}
}
void delect_x(int x,LinkList &L){
//1.如果L.next == NULL,那么递归结束,退出
if(L->next == NULL){return;}
//2.如果L.data == x,那么删除x ,delect_x(l.next,x)
if(L->data == x){
Lnode *p = L;
L = L->next;//不会出现断链因为本层的L是上层的L->next,将本层的L赋值为L->next,实质是将L上层的next赋值为L下层的next
free(p);
cout<<p->data<<endl;
delect_x(x,L);
} else{
delect_x(x,L->next); //3.如果L.data != x ,那么直接执行delet_x(l.next,x)
}
}
int main(){
LinkList L,p;
init_linklist(L);
p = L;
while(p != NULL){
cout<<p->data<<" ";
p = p->next;
}
delect_x(4,L);
p = L;
while(p != NULL){
cout<<p->data<<" ";
p = p->next;
}
}
网友评论