数据结构笔记1
线性结构: 1、连续存储(数组)
什么叫数组:类型相同,大小相等
2、离散存储(链表)
定义:n个节点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱节点,尾节点没有后续节点
首节点:第一个有效节点 尾节点:最后一个有效节点
头指针:指向头节点的指针变量
头节点:头节点的数据类型和首节点类型一样,第一个有效节点之前的那个节点,可以简便链表算法的操作,头节点并不存放有效 数据
确定一个链表需要几个参数:只需要一个参数:头指针,因为我们通过头指针可以推算链表的其它所有参数。
链表的分类:
单链表、双链表(每个节点都有两个指针域)
循环链表、非循环链表
C语言结构体引用中.与->的区别
如果只是结构体就用.
如果是结构体的指针就用->
自动增长因子:每次内存扩充的大小
# include <stdio.h> # include <malloc.h> //包含了malloc函数 # include <stdlib.h> //包含了exit函数 //定义了一个数据类型,该数据类型的名字叫做struct Arr, 该数据类型含有三个成员,分别是pBase, len, cnt struct Arr { int * pBase; //存储的是数组第一个元素的地址 int len; //数组所能容纳的最大元素的个数 int cnt; //当前数组有效元素的个数 }; 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 * pVal); int get(); bool is_empty(struct Arr * pArr); bool is_full(struct Arr * pArr); void sort_arr(struct Arr * pArr); void show_arr(struct Arr * pArr); void inversion_arr(struct Arr * pArr); int main(void) { struct Arr arr; int val; init_arr(&arr, 6); show_arr(&arr); //只传一个地址,效率较高。。如果整个数组数据都传过去效率慢 append_arr(&arr, 1); append_arr(&arr, 10); append_arr(&arr, -3); append_arr(&arr, 6); append_arr(&arr, 88); append_arr(&arr, 11); if ( delete_arr(&arr, 4, &val) ) { printf("删除成功!\n"); printf("您删除的元素是: %d\n", val); } else { printf("删除失败!\n"); } /* append_arr(&arr, 2); append_arr(&arr, 3); append_arr(&arr, 4); append_arr(&arr, 5); insert_arr(&arr, -1, 99); append_arr(&arr, 6); append_arr(&arr, 7); if ( append_arr(&arr, 8) ) { printf("追加成功\n"); } else { printf("追加失败!\n"); } */ show_arr(&arr); inversion_arr(&arr); printf("倒置之后的数组内容是:\n"); show_arr(&arr); sort_arr(&arr); show_arr(&arr); //printf("%d\n", arr.len); return 0; } void init_arr(struct Arr * pArr, int length) { pArr->pBase = (int *)malloc(sizeof(int) * length);//只是赋第一个地址 if (NULL == pArr->pBase) { printf("动态内存分配失败!\n"); exit(-1); //终止整个程序 } else { pArr->len = length; pArr->cnt = 0; //刚初始化 ,有效元素个数为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->cnt == pArr->len) 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]); //int * printf("\n"); } } bool append_arr(struct Arr * pArr, int val) { //满是返回false if ( is_full(pArr) ) return false; //不满时追加 pArr->pBase[pArr->cnt] = val; (pArr->cnt)++; return true; } bool insert_arr(struct Arr * pArr, int pos, int val) { 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; } bool delete_arr(struct Arr * pArr, int pos, int * pVal) { int i; if ( is_empty(pArr) ) return false; if (pos<1 || pos>pArr->cnt) return false; *pVal = pArr->pBase[pos-1]; for (i=pos; i<pArr->cnt; ++i) { pArr->pBase[i-1] = pArr->pBase[i]; } pArr->cnt--; return true; } void inversion_arr(struct Arr * pArr) { int i = 0; int j = pArr->cnt-1; int t; while (i < j) { t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[j]; pArr->pBase[j] = t; ++i; --j; } return; } void sort_arr(struct Arr * pArr) { int i, j, t; for (i=0; i<pArr->cnt; ++i) { for (j=i+1; j<pArr->cnt; ++j) { if (pArr->pBase[i] > pArr->pBase[j]) { t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[j]; pArr->pBase[j] = t; } } } }
浙公网安备 33010602011771号