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

时间:2022-09-05 14:50:33

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


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

头文件

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

#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 可以节约内存就可以了哈,说真的自己感觉使用的还是非常少。