zoukankan      html  css  js  c++  java
  • 数据结构与算法入门C语言 (二) 线性结构-连续存储[线性表(数组)]


    笔记来源于郝斌老师数据结构与算法视频,博主学习后 纯手打,侵删。

    线性结构[把所有节点用一根线穿起来]

    连续存储[线性表(数组)]

    一、定义和概念

    • 什么叫数组?
      元素类型相同,大小相等

    • 确定一个数组需要几个参数?

      • 数组的大小
      • 数组有效存储量
      • 数组首地址
    • 数组的优缺点(相对于链表)

      • 优点:存取速度快
      • 缺点:
        • 实现必须知道数组的大小
        • 需要大块连续存储的内存块
        • 插入和删除元素很慢
        • 空间通常是有限制的

    二、ArrrayList实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    //定义了一个数据类型,该数据类型的名字叫做 struct Arr,该数据类型含有下面4个成员
    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);
    bool delete_arr(struct Arr * pArr,int pos,int del_val);
    int get(struct Arr *pArr,int i);
    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 inverse_arr(struct Arr * pArr);
    
    int main(void){
    	int i;
    	int val;
      	struct Arr arr;
      	init_arr(&arr,6);
      	show_arr(&arr);
      	for(i = 0;i < 8;i++)
        	append_arr(&arr,i);
        	show_arr(&arr);
      	delete_arr(&arr,4,&val);
      	printf("删除的元素的值是:%d
    ",val);
      	show_arr(&val);
      	insert_arr(&arr,1,99);
      	show_arr(&val);
      	inversr_arr(&val);
      	show_arr(&val);
      	sort_arr(&val);
      	show_arr(&val);
      	printf("%d
    ",get(&arr,5));
      	return 0;
     }
      
     
    void init_arr(struct student 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 false;
      	else
      	 return true;
    }
    
    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("[]
    ");// printf("数组为空
    ");
    }
      	else
      	{
    	 for (int i=0; i<pArr->cnt; i++)
           printf("%d",pArr -> pBase[i];) //int *
           printf("
    ");
    	}
    }
    
    bool append_arr(struct Arr * pArr,int val)
    {
    	//满时返回false
    	if(is_full(pArr))
      	return false;
      	//不满时追加
      	pArr -> pBase[pArr -> cnt] = val;
      	pArr -> cnt++;
      	return true;
    }
    
     void insert_arr(struct Arr * pArr,int pos,int val)
     98 {
     99     if ( is_full(pArr) )
    100     {
    101         printf("数组已满,无法插入!
    ");
    102         return;
    103     }
    104     if ( pos < 1 || pos > pArr->cnt)
    105     {
    106         printf("指定位置有误,无法插入!
    ");
    107         return;
    108     }
    109     
    110     for (int i=pArr->cnt; i<pos-1; --i)
    111     {
    112         pArr->pBase[i+1]=pArr->pBase[i];
    113     }
    114     pArr->pBase[pos-1]=val;
    115     pArr->cnt ++;
    116     return;
    117 }
    
    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 inverse_arr(struct Arr * pArr)
    {
    	int i = 0int t;
    	int j = pArr->cnt-1;
    	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[i]);
       		   t = pArr->pBase[i];
      		   pArr->pBase[i] = pArr->pBase[j];
      		   pArr->pBase[j] = t;
    	  }
        }
    }      
    

    补充知识点:typedef 用法

    /*
    #include<stdio.h>
    typedef int Lee;// 为int 再重新多取一个名字名字 Lee 等价于 int
    typedef struct Student
    	{
         int sid;
         char name[100];
         char sex;
    	}ST;
    int main(void)
    {
    	// int i = 10;//等价于Lee i =10;
    	// Lee j = 20;
    	// printf("%d",j);
    	struct Student st; // 等价于 ST st;
    	// struct Student * pS = &st; //等价于 ST * pS;
    	ST st2;
    	st2.sid = 20;
    	printf("%d
    ",st2.sid);
    	return 0;
    }  
        */
    typedef struct Student
    {
    	int sid;
    	char name[100];
    	char sex;
    } * PSTU,STU;// PSTU等价于struct Student *  ,ST代表了struct Student
    
    int main(void)
    {
    /*
    	struct Student st;
    	PSTU ps = &st;
      	ps->sid = 99;
      	printf("%d
    ",ps->sid);
      	return 0;
    */
    
    	STU st;//struct Student st;
    	PSTU ps = &st;//struct Student  *ps =&st;
    	ps->sid = 111;
      	printf("%d
    ",ps->sid);
      	return 0;
    }
         
         
       
    
  • 相关阅读:
    获得二进制有多少个1
    读取txt数据
    int最大值
    oracle——数据表的相关操作——约束——各种约束详解
    oracle——数据表的相关操作——转移表空间
    oracle——数据表的相关操作——删除数据表
    oracle——数据表的数据查询——oracle高级函数
    oracle——数据表的相关操作——更新数据——update操作
    oracle——数据表的数据查询——oracle中的特殊表达式between and、in、like、is null、exists、all、some、any等
    oracle——数据表的数据查询——distinct 关键字、group by 字句、having子句
  • 原文地址:https://www.cnblogs.com/JhonnyLee/p/13751383.html
Copyright © 2011-2022 走看看