4.2 结构(struct) 与共用体(union)

概念性的东西就没必要多说了,想必有一定的C基础都会知道结构体和共用体,当然这个不是我这次的重点,重点是程序员经常使用的!


1 结构体说白了,就是将不同的类型组装起来,组装以后一般作为参数传递给函数(在C中要注意结构体一般初始化结构体,经常使用到malloc 分配空间,在bzero 基本就ok啦),当然也可以让函数返回一个结构体哈。待会可以贴一个C的例子参考(呵呵。学习C++貌似自己在回味c了呢大笑)!

头文件

也算一个数据结构哈!来看看吧,使用结构体                           头文件来了哈!(学习时候写的,所以你懂的。。。。。)

#ifndef _ALIST_
#define _ALIST_
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define SIZE   10
#define DATA    0 
#define OFFSET  1
#define HEAD    0
#define TAIL   -1

typedef int data_t;
typedef struct alist{
 data_t data[SIZE];
 int num;
}ALIST;
ALIST *creat_alist(void);
void init_alist(ALIST *L);
int is_full(ALIST *L);
int is_null(ALIST *L);
void insert_alist(ALIST *L, data_t data, int offset);
int find_alist(ALIST *L, data_t data);
void delet_alist(ALIST *L, data_t data, int flage);
void sort_alist(ALIST *L, int flage);
void show_alist(ALIST *L);
#endif


实现

#include "alist.h"
ALIST *creat_alist(void)
{
 ALIST *L = (ALIST *)malloc(sizeof(ALIST));
 if(NULL == L)
  exit(-1);
 bzero(L, sizeof(ALIST));
 L->num = -1;
 return L;
}
void init_alist(ALIST *L) 
{
 bzero(L, sizeof(ALIST));
 L->num = -1;
}
int is_full(ALIST *L)
{
 return L->num == SIZE-1?1:0;
}
int is_null(ALIST *L)
{
 return L->num == -1?1:0;
}
void insert_alist(ALIST *L, data_t data, int offset)
{
 int n = L->num+1;
 switch(offset)
 {
 case HEAD:
  while(n--)
   L->data[n+1] = L->data[n];
  L->data[0] = data;
  L->num++;
  break;
 case TAIL:
  L->data[L->num+1] = data;
  L->num++;
  break;
 default:
  if(0 > offset)
   insert_alist(L, data, HEAD);
  else
  if(L->num < offset)
   insert_alist(L, data, TAIL);
  else
  {
   while(n-- > offset)
    L->data[n+1] = L->data[n];
   L->data[offset] = data;
   L->num++;
  }
  break;
 }
}
int find_alist(ALIST *L, data_t data)
{
 int i = 0;
 for(;i <= L->num; i++)
  if(data == L->data[i])
   return i;
 return -1;
}
void delet_alist(ALIST *L, data_t data, int flage)
{
 int n;
 int i;
 switch(flage)
 {
 case DATA:
  if(0 > (n = find_alist(L, data)))
   return;
  else
  {
   for(i = n; i < L->num; i++)
    L->data[i] = L->data[i+1];
   L->num--;
  }
  break;
 case OFFSET:
  if(data < 0 || data > L->num)
   return;
  else
  {
   n = data;
   while(n++ < L->num)
    L->data[n-1] = L->data[n];
   L->num--;
  }
  break;
 default:
  break;
 } 
}
void sort_alist(ALIST *L, int flage)
{
// if(flage == UP?a[i] > a[i+1]:a[i] < a[i+1])
}
void show_alist(ALIST *L)
{
 int i = 0;
 for(;i <= L->num; i++)
  printf("%d, ", L->data[i]);
 printf("\n");
}


ok ,结构体使用就这些了哈!

 

2  共用体  待续

共用体和结构体还是不太一样哈,结构体可以存储不同的类型,而结构体只可以存储其中的一种类型。

上次同学还在讨论共用体问题,所以自己还是记得清楚,此时注意strut 和union的大小问题(由于公用体每次都只能存储一个值{int long 或 double},所以为最大成员长度),同时应该注意union是在编译运行时分配大小的哦!

根据上面的几点,你应该可以,知道union 可以节约内存就可以了哈,说真的自己感觉使用的还是非常少。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值