一 数组
1. 创建数组:
1). 定义数组数据类型(struct Array)
2). 定义数组变量(struct Array arr)
3). 初始化数组变量(首地址,长度,有效元素个数)
4). 显示数组
2. 添加数组元素
/*
时间:2018.05.09 14:10
项目:认识、了解《数组》
创建数组
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> // 包含了 exit 函数
// 定义了一个数据类型,数据类型的名字为struct Arr,该数据类型有含有3个成员,分别为 pBase,len,cnt
struct Arr
{
int * pBase; // 数组一个元素的地址
int len; // 数组长度
int cnt; // 数组有效元素
//int increment; // 数组长度自动增长因子 (暂时不讲)
};
// 函数声明
void init_arr(struct Arr *pArr, int length);
bool append_arr(struct Arr *pArr, int val); // 追加
bool insert_arr(struct Arr *pArr, int pos, int val); // pos 的值从1开始
bool delete_arr(struct Arr *pArr, int pos);
int get();
bool is_empty(struct Arr *pArr);
bool is_full(struct Arr *pArr);
void sort_arr();
void show_arr(struct Arr *pArr);
void invertion_arr();
// 主函数
int main()
{
struct Arr arr; // 定义一个数组
init_arr(&arr, 6); // 初始化数组
show_arr(&arr);
append_arr(&arr, 1); // 追加数组
append_arr(&arr, 2);
append_arr(&arr, 3);
append_arr(&arr, 4);
append_arr(&arr, 5);
show_arr(&arr);
insert_arr(&arr, 6, 99);
show_arr(&arr);
return 0;
}
// 子函数
void init_arr(struct Arr *pArr, int length)
{
// 1. 通过动态分配内存的方式,向系统申请一块连续的空间用来存放数组中的元素,然后把数组的首地址返回给指针pArr
pArr->pBase = (int*)malloc(sizeof(int) * length);
if (NULL == pArr->pBase)
{
printf("动态内存分配失败!\n");
exit (-1);
}
// 2. 初始化数组的另外两个特性:长度len、有效元素个数 cnt
else
{
pArr->len = length;
pArr->cnt = 0;
}
// 至此,初始化完成,向系统人为申请了一块空间,该空间的第一个单元的地址存在数组的pBase中,数组长度为 length(主函数会赋值),有效元素个数cnt为 0
return;
}
bool is_empty(struct Arr *pArr)
{
if(0 == pArr->cnt)
return true;
else
return false;
}
bool is_full(struct Arr *pArr)
{
if(pArr->len == pArr->cnt)
return true;
else
return false;
}
void show_arr(struct Arr *pArr)
{
if (is_empty(pArr))
{
printf("数组为空!\n");
}
else
{
for (int i=0; i < pArr->cnt; ++i)
printf("%d ", pArr->pBase[i]);
printf("\n");
}
}
bool append_arr(struct Arr *pArr, int val)
{
if(is_full(pArr))
return false; // 满时不加
else
{
pArr->pBase[pArr->cnt] = val;
++(pArr->cnt);
return false;
}
}
bool insert_arr(struct Arr *pArr, int pos, int val) // 分两步:1.挪出空位;2.放数
{
int i;
if (is_full(pArr))
return false;
if (pos<1 || pos>pArr->cnt+1)
return false;
for(i = pArr->cnt-1; i>= pos-1; --i)
{
pArr->pBase[i+1] = pArr->pBase[i];
}
pArr->pBase[pos-1] = val;
pArr->cnt++;
return true;
}
二 链表
创建链表:
1. 定义链表数据类型(struct Node)
2. 创建链表
3. 遍历链表(输出链表数据)
/*
时间:2018.05.09 15:42
项目:认识、了解《链表》
1. 创建链表
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
} NODE, *PNODE;
//声明子函数
PNODE create_list(void);
void traverse_list(PNODE pHead);
// 主函数
int main()
{
PNODE pHead = NULL;
pHead = create_list(); // 创建一个非循环单链表,并将该链表的头节点的地址赋给pHEAD
traverse_list(pHead);
return 0;
}
PNODE create_list(void)
{
int len; // 节点的个数
int i;
int val; // 节点的数据
// 分配了一个不存放有效数据的头节点
PNODE pHead = (PNODE)malloc(sizeof(NODE)); // 为头节点分配内存
if (NULL == pHead)
{
printf("头节点的内存分配失败,程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;
printf("请输入您需要生成的链接节点的个数:len = ");
scanf("%d", &len);
for(i = 0; i<len; ++i)
{
printf("请输入第%d个节点的值: ", i+1);
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); // ?为什么是sizeof(NODE)
if (NULL == pNew)
{
printf("新节点的内存分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL ==! p)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
}