第十四周:*链表

简介: 第一遍没看明白也没关系,慢慢来,会慢慢看懂的。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;

}

目录
相关文章
|
设计模式 缓存 前端开发
最近一个月把大厂面了个遍,还未上岸……
本文由我的读者小伙伴 sensFeng 投稿,这一个月他面了很多家大公司,这份面试经验对最近正在准备找工作的小伙伴可以说是非常有参考价值了,在文章中他也给出了他整理的答案,诚意满满!
|
程序员
773.每周复盘-第十二周
773.每周复盘-第十二周
102 0
|
存储
数据结构上机实践第八周项目6- 猴子选大王(数组版)
数据结构上机实践第八周项目6- 猴子选大王(数组版)
168 0
数据结构上机实践第八周项目6- 猴子选大王(数组版)
算法每日一题——第一天——统计特殊四元组
算法每日一题——第一天——统计特殊四元组
算法每日一题——第一天——统计特殊四元组
|
存储 人工智能
PAT-2021年秋季考试 乙级 7-4 数组与链表 (20 分)
让我们来设计这样一种数组与链表结合的整数存储的结构 A
131 0
|
机器学习/深度学习 存储 编解码
第十三周:文件
重点学习按位运算
124 0
算法每日一题——第三天——完美数
算法每日一题——第三天——完美数
算法每日一题——第三天——完美数
|
算法 Java Python
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)
201 0
【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)
|
算法
数据结构与算法题目集(中文) - 7-35 城市间紧急救援(25 分)
数据结构与算法题目集(中文) - 7-35 城市间紧急救援(25 分)
173 0