(郝斌讲学)数据结构学习篇(二)---数组的操作连续存储

来源:互联网 发布:jquery.cookie.js 编辑:程序博客网 时间:2024/05/16 09:36

012.连续存储数组的算法演示

线性结构:把所有的结点用一根直线穿起来.

一个字节有4个地址。

 

实现一个数组的案例

#include<stdio.h>#include<malloc.h>#include<stdlib.h>  //包含了exit函数struct Arr{int * pBase; //数组第一个元素的地址int len; //数组的长度int cnt; //当前数组有效元素的个数};int get();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);bool is_empty(struct Arr * pArr);bool is_full(struct Arr * pArr);void init_arr(struct Arr * pArr, int len);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 p;init_arr(&arr,8);show_arr(&arr);append_arr(&arr,1);append_arr(&arr,2);append_arr(&arr,5);append_arr(&arr,6);show_arr(&arr);printf("插入的结果是:");insert_arr(&arr, 3, 88);insert_arr(&arr, 5, -5);insert_arr(&arr, 1, 60);show_arr(&arr);if(delete_arr(&arr, 2, &p)){printf("删除成功!\n");printf("删除的元素是:%d\n", p);}else{printf("删除失败!\n");}printf("删除的结果是:");show_arr(&arr);printf("倒置的结果是:");inversion_arr(&arr);show_arr(&arr);printf("排序的结果是:");sort_arr(&arr);show_arr(&arr);return 0;}//初始化数组void init_arr(struct Arr *pArr, int length){pArr->pBase = (int *)malloc(sizeof(int) *length);if(NULL == pArr->pBase){printf("动态内存分配失败!");exit(-1);}else{pArr->len = length;pArr->cnt = 0;}return;}//判断数组是否为空bool is_empty(struct Arr * pArr){if(0 == pArr->cnt)return true;elsereturn 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 is_full(struct Arr * pArr){if(pArr->cnt == pArr->len)return true;elsereturn false;}//追加一个元素bool append_arr(struct Arr * pArr, int val){//满是返回falseif(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;}}}}

015.type的用法

 

#include <stdio.h>

 

typedef struct Node

{

int data;  //数据域

struct Node * pNext; //指针域

}NODE, *PNODE; //NODE等价于struct Node, PNODE等价于struct Node*

 

int main(void)

{

 

return 0;

}

 

typedef int ZHENGXING;

int i = 10;  ==>>ZHENGXING i = 10;

 

016.链表的定义

离散存储[链表]n个节点离散分配,彼此通过指针相连。每个节点只有一个前驱节点,每个节点只有一个后续节点。首节点没有前驱节点,尾节点没有后续节点。

 

专业术语:

首节点:第一个有效节点

尾节点:最后一个有效节点

头结点:第一个有效节点之前的那个节点。没有存放有效数据,也没有存放有效数据的个数。目的是为了方便对链表的操作。

头指针:指向头结点的指针变量。

尾指针:指向尾节点的指针变量。

 

017.如果希望通过一个函数来对链表进行处理,我们至少需要链表的哪些参数?

只需要一个参数:头指针

因为我们通过头指针就可以推算出链表的其他所有信息。

 

019.链表的分类

单链表

双链表:每一个节点有两个指针域

循环链表:能通过任何一个节点找到其他所有的节点

非循环链表

0 0