C指针(4)——数据结构中指针的应用(程序讲解)
程序员文章站
2022-07-10 22:21:56
5-1动态内存分配,分配的是堆内存的空间 分配内存函数 (都集中在库函数 stdlib.h 中) 在使用动态分配之前,首先要判断是否分配成功。 内存的释放函数原型: 内存释放后建议把指针指向NULL 5-2队列(初始化,入队,出队,判断空,判断满) 单向队列 循环队列 (队头和队尾有两种情况会指向同 ......
5-1动态内存分配,分配的是堆内存的空间
- 分配内存函数 (都集中在库函数 stdlib.h 中)
void *malloc (unsigned int num_bytes); //指定分配内存空间大小,大小为 num_bytes字节,其值是随机值。 void *calloc (unsigned num ,unsigned size); //参数包含元素的数量和每个元素的字节数,内存空间为num*sie void *realloc(void *ptr,size_t size); //调用该函数对内存空间进行重新分配,ptr指向已有的内存空间,size用来指定重新分配后所得整个空间大小
在使用动态分配之前,首先要判断是否分配成功。
- 内存的释放函数原型:
void free(void *ptr); //动态分配的内存使用结束后,要及时释放,
内存释放后建议把指针指向NULL
5-2队列(初始化,入队,出队,判断空,判断满)
- 单向队列
- 循环队列 (队头和队尾有两种情况会指向同一位置,一是队列空了,二是队列满了)
#define QueueSize_UartLen 8 typedef struct { int front; //队头 int rear; //队尾 int counter; //记录队列元素的个数 int uart_data[QueneSize_UartLen]; //定义数组用来存储队列的元素 }CIRQUEUE_UART; //定义结构体,用typedef把结构体重新命名为CIRQUEUE_UART void InitQueue(CIRQUEUE_UART *queue) //初始化形参,CIRQUEUE_UART类型的指针变量queue,队列的初始化 { queue->front=0; //->与指向结构体变量的指针相连,表示指向结构体变量指针的成员(左边为指针,注意与 . 的区别) queue->rear=0; queue->counter=0; } int Inqueue(CIRQUEUE_UART *queue,int data) //入队 { if(QueueFull(queue)) //队满判断 { return 0; //输出队满提示 } else { queue->uart_data[queue->rear]=data; //queue->rear指向队尾待插入数据位置 queue->counter++; //计数器加1 queue->rear=(queue->rear+1)%QueueSize_UartLen; //然后指queue->rear向下一个待插入数据的位置 return 1; } } int OutQueue(CIRQUEUE_UART *queue,int *p_data) //出队 通过指针p_data取出队的数据 { if(QueueEmpty(queue)) { return 0; } else { *p_data=queue->data(front); //先把出队的数据元素取出放在p_data queue->counter--; //计数器减1 queue->front=(queue->front+1)%QueueSize_UartLen; //然后指queue->front向下一个位置 return 1; } } int QueueEmpty(CIRQUEUE_UART *queue) //判断队空 { return queue->count==0; } int QueueFull(CIRQUEUE_UART *queue) //判断队满 { return queue->counter==QueueSize_UartLen; }
- 链式队列
typedef struct LinkNode_t { int data; struct LinkNode_t *next; }LinkNode; typedef struct LinkPoint_t { struct LinkNode_t *front; struct LinkNode_t *rear; }LinkQueue; LinkQueue *queue; LinkNode *node; LinkQueue LinkQueueInit() //初始化 { queue_t=(LinkQueue)malloc(sizeof(LinkQueue)); node=(LinkQueue)malloc(sizeof(LinkNode)); node->front=queue->rear->next; queue_t->front=queue->rear->node; return queue_t; } void InlinkQueue(LinkQueue *queue,int data) //进队 { node=(LinkNode)malloc(sizeof(LinkNode)); node->data=data; node->next=queue->rear->next; queue->rear->next=node; queue->rear=node; } void OutQueue(LinkQueue *queue) //出队 { int data; if(!LQEmpty(queue)) { node=queue->front->next; queue->front->next=node->next; data=node->data; if(node==queue->rear) { queue->rear=queue->front; } free(node); return data; } } int LQEmpty(LinkQueue *queue) //对空判断 { if(queue->front==queue->rear) { return 1; } else { return 0; } }
5-3堆栈(初始化,进栈,出栈,栈空的判断,栈满的判断,取栈顶元素)
5-4链表(链表建立,链表初始化,链表插入,链表删除)
5-5树
(未完,待续......)