第十四周:*链表

简介: 第一遍没看明白也没关系,慢慢来,会慢慢看懂的。C语言的基础到这里你就都了解了,配套的课程移步去中国大学慕课看浙江大学翁恺老师的课程,那是梦的开始

14.1-1*可变数组

the Interface

  1. Array array_create(int init_size);创建数组
  2. void array_free(Array*a);回收数组
  3. int array_size(const Array*a);告诉我们数组里面现在有几个单元可以使用
  4. intarray_at(Arraya,int index);访问数组某个单元
  5. void array_inflate(Array*a,int more_size);让数组

#ifndef _ARRAY_H_

#define _ARRAY_H_

typedefstruct {

   int*array;

   intsize;

}Array;

Arrayarray_create(intinit_size);

voidarray_free(Array*a);

intarray_size(constArray*a);

4.int*array_at(Array*a,intindex);

5.voidarray_inflate(Array*a,intmore_size);

#endif

#include "array.h"

Arrayarray_create(intinit_size)

{

   Arraya;//首先是数组的创建,需要用到动态内存分配,结合所需要的size,来创建一个数组

   a.size=init_size;

   a.array= (int*)malloc(sizeof(int)*a.size);

   returna;

}

voidarray_free(Array*a)//再然后就是内存的释放、得到数组的大小

{

   free(a->array);

   a->array=NULL;

   a->size=0;

}

intarray_size(constArray*a);

int*array_at(Array*a,intindex);

voidarray_inflate(Array*a,intmore_size);

intmain(intargc,charconst*argv[])

{

   Arraya=array_create(100);

   

   return0;

}

14.1-2可变数组的数据访问

//从上述第16行内容延续,这里需要多加两个标准头文件

#include

#include

//3-6行的代码叫做封装,能够将里面的内容保护起来,这样别人就不知道你里面什么样子的了,保持神秘感哈哈

intarray_size(constArray*a)

{

    returna->size;

}

int*array_at(Array*a,intindex)//在然后是进行该数组的访问和修改

    //这里面需要注意的是array_at的返回需要是一个指针,如此便可以做到修改

{

    return&(a->array[index]);

}

int*array_get(constArray*a,intindex);

{

   returna->array[index];

}

voidarray_set(Array*a,intindex, intvalue)

{

   a->array[index] =value;

}

voidarray_inflate(Array*a,intmore_size);

intmain(intargc,charconst*argv[])

{

   Arraya=array_create(100);

   printf("%d\n",array_size(&a));

   //printf("%d\n",a.size);十七行跟十六行一个意思

   *array_at(&a,0) =10;//将一个值写到数组里面

   printf("%d\n",*array_at(&a,0));

   array_free(&a);

   

   return0;

}

14.1-3可变数组的自动增长

//从上述24行延续

voidarray_inflate(Array*a,intmore_size)

{

    int*p= (int*)malloc(sizeof(int)(a->size+more_size));

    inti;

    for( i=0; i<a->size; i++ ) {

        p[i] =a->size[i];

    }//可以换成标准库的函数mencpy,效率更高

    free(a->array);

    a->array=p;

    a->size+=more_size;

}//核心代码

intmain(intargc,charconst*argv[])

{

   Arraya=array_create(100);

   printf("%d\n",array_size(&a));

   //printf("%d\n",a.size);十七行跟十六行一个意思

   *array_at(&a,0) =10;//将一个值写到数组里面

   printf("%d\n",*array_at(&a,0));

   intnumber;

   intcnt=0;

   while(number!=-1 ){

       scanf("%d",&number);

       if( number!=-1 ){

       *array_at(&a,cnt++) =number;

       //scanf("%d",array_at(&a,cnt++));

   }//无限的读入整数,让自己不断的自己增长

   array_free(&a);

   

   return0;

}

//第九行的内容改动

int*array_at(Array*a,intindex)//在然后是进行该数组的访问和修改

    //这里面需要注意的是array_at的返回需要是一个指针,如此便可以做到修改

{

   if( index>=a->size ){

       array_inflate(a,(index/BLOCK_SIZE+1)-a->size+1);//这里有点乱,后续要来修正

   }

    return&(a->array[index]);

}

14.2-1可变数组的缺陷

  1. 申请使用内存,当我们需要更大的内存而之前的不需要了之后,之前的就会被废弃掉,在内存受限的情况下(比如单片机)就会导致内存明明还有,但是却已经申请不了更大的内存了(浪费内存空间)
  2. 效率极低

14.2-2链表

  1. 这是为百度进来补充的图,翁恺的课程是没有静态的图,用动态进行演示的

#include"node.h"

#include

#include

//typedef struct _node{

//    int value;

//    struct _node *next;

//}Node;

intmain(intargc,charconstargv[])

{

   Node*head=NULL;

   intnumber;

   do{

       scanf("%d",&number);

       if( number!=-1 ) {

           //add to linked-list

           Node*p= (Node*)malloc(size(Node));

           p->next=NULL;

           //find the last

           Node*last=head;

           if( last ){

               while (last->next){

                   last=last->next;

                   }

               //attach

               last->next=p;

               }else{

                   head=p;

           }

       }

   }while( number!=-1 );

   

   return0;

}

14.2-3链表的函数

#include"node.h"

#include

#include

//typedef struct _node{

//    int value;

//    struct _node *next;

//}Node;

voidadd(Node*head,intnumber);

typedefstruct_list{

   Node*head;

   Node*tail;

}List;

intmain(intargc,charconstargv[])

{

   Node*head=NULL;

   Listlist;

   intnumber;

   list.head=list.tail=NULL;

   do{

       scanf("%d",&number);

       if( number!=-1 ){

           add(&list,number);

       }

   }while( number!=-1);

   

   return0;

}

voidadd(List*pList,intnumber)

{

      //add to linked-list

   Node*p= (Node*)malloc(size(Node));

   p->value=number;

   p->next=NULL;

   //find the last

   Node*last=pList->head;

      if( last ){

         while (last->next){

             last=last->next;

           }

         //attach

          last->next=p;

         }else{

           head=p;

   }

   returnhead;

}

14.2-4链表的搜索

//从上述16行延续

voidprint(List*pList)//函数原型置顶,另外说明我没有把这个置顶到其他代码块里面

voidadd(List*pList,intnumber)    

 

intmain(intargc,charconstargv[])

{

   Node*head=NULL;

   Listlist;

   intnumber;

   list.head=list.tail=NULL;

   do{

       scanf("%d",&number);

       if( number!=-1 ){

           add(&list,number);

       }

   }while( number!=-1);

   

   printf(&list);

   scanf("%d",&number);

   Node*p;

   intisFound=0;

   for( p=list.head; p; p=p->next){

       if( p->value==number ){

           printf("找到了\n");

           isFound=1;

           break;

       }

   }

   if ( !isFound ){

       printf("没找到\n");

   }

   //Node*p;

   //for( p=list.head; p; p = p->next){

   //    printf("%d\t",p->value);

   //}//遍历,把链表每个节点的值打出来

   //printf("\n");  这些内容转移到下面了,并且有了一部分的改动

   

   return0;

}

voidadd(List*pList,intnumber)

{

      //add to linked-list

   Node*p= (Node*)malloc(size(Node));

   p->value=number;

   p->next=NULL;

   //find the last

   Node*last=pList->head;

      if( last ){

         while (last->next){

             last=last->next;

           }

         //attach

          last->next=p;

      }else{

           head=p;

      }

}

voidprint(List*pList){

   Node*p;

   for( p=list->head; p; p=p->next){

       printf("%d\t",p->value);

   }//遍历,把链表每个节点的值打出来

   printf("\n");

}

14.2-5链表的删除

//从上述第5行开始

intmain(intargc,charconstargv[])

{

   Node*head=NULL;

   Listlist;

   intnumber;

   list.head=list.tail=NULL;

   do{

       scanf("%d",&number);

       if( number!=-1 ){

           add(&list,number);

       }

   }while( number!=-1);

   

   printf(&list);

   scanf("%d",&number);

   Node*p;

   intisFound=0;

   for( p=NULL; p=list.head; q=p,p=p->next){

       if( p->value==number ){

           //需要考虑到边界效应,q没有进行限制需要进行限制

           if(q){

               q->next=p->next;

           } else {

               list.head=p->next;

           }

           //q->next = p->next;

           free(p);

           break;

       }

   }

   //Node*p;

   //for( p=list.head; p; p = p->next){

   //    printf("%d\t",p->value);

   //}//遍历,把链表每个节点的值打出来

   //printf("\n");  这些内容转移到下面了,并且有了一部分的改动

   

   return0;

}

14.2-6链表的清除

如何整个链表都清除掉

   //从上述19行开始

   for( p=NULL; p=list.head; q=p,p=p->next){

       if( p->value==number ){

           //需要考虑到边界效应,q没有进行限制需要进行限制

           if(q){

               q->next=p->next;

           } else {

               list.head=p->next;

           }

           //q->next = p->next;

           free(p);

           break;

       }

   }

   for( p=head; p; p=q ){

       q=p->next;

       free(p);

   }//链表这样就删除掉了    

   return0;

}

目录
相关文章
|
9月前
|
存储 算法 数据库
十天学完基础数据结构-第一天(绪论)
十天学完基础数据结构-第一天(绪论)
45 0
|
机器学习/深度学习 存储 测试技术
蓝桥杯冲刺-倒数第八天-省赛题
蓝桥杯冲刺-倒数第八天-省赛题
96 0
|
存储 人工智能
PAT-2021年秋季考试 乙级 7-4 数组与链表 (20 分)
让我们来设计这样一种数组与链表结合的整数存储的结构 A
112 0
|
机器学习/深度学习 存储 编解码
第十三周:文件
重点学习按位运算
110 0
算法每日一题——第一天——统计特殊四元组
算法每日一题——第一天——统计特殊四元组
算法每日一题——第一天——统计特殊四元组
|
程序员
蓝桥杯倒数七天之每日复习第一天
大家好,我是泡泡,离蓝桥杯还有一周,大家放平心态!!冲刺省一 国一!!! 因为是复习,是之前做过的题,跟着做过的小伙伴试着别看自己之前的代码敲出来!
131 0
蓝桥杯倒数七天之每日复习第一天
蓝桥31日冲刺 | 每日三题题解报告 第一天
大家好,我是泡泡,今天给大家带来今日打卡三道题的题解
145 0
|
人工智能 测试技术
蓝桥杯倒数七天冲刺国一之每日复习第二天
距离蓝桥杯还有六天!!各位加油!!!不要忘了打印准考证测试环境!
83 0
|
机器学习/深度学习 人工智能
蓝桥杯倒数七天冲刺国一之每日复习第三天
大家好,我是泡泡,今天继续复习
147 0
|
算法
算法竞赛基础题做题记录:月份天数
算法竞赛基础题:月份天数
107 1