欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C指针(4)——数据结构中指针的应用(程序讲解)

程序员文章站 2022-04-16 09:01:24
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树

 

(未完,待续......)