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;
    }
         
         
       
    
  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/JhonnyLee/p/13751383.html
Copyright © 2011-2022 走看看