第十四周:*链表

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

}

目录
相关文章
|
7月前
|
调度 容器
【错题集-编程题】主持人调度(二)(贪心 + 优先级队列)
【错题集-编程题】主持人调度(二)(贪心 + 优先级队列)
|
存储
L1-049 天梯赛座位分配 (20 分)( for循环的深入理解+三维数组+错误分析)
L1-049 天梯赛座位分配 (20 分)( for循环的深入理解+三维数组+错误分析)
164 0
|
设计模式 缓存 前端开发
最近一个月把大厂面了个遍,还未上岸……
本文由我的读者小伙伴 sensFeng 投稿,这一个月他面了很多家大公司,这份面试经验对最近正在准备找工作的小伙伴可以说是非常有参考价值了,在文章中他也给出了他整理的答案,诚意满满!
【寒假每日一题】AcWing 3400. 统计次数(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
53 0
|
人工智能 测试技术
【寒假每日一题】AcWing 4655. 重新排序(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 1、前缀和与差分 2、排序不等式
62 0
【八月】 每日一题 - 768. 最多能完成排序的块 I and II
【八月】 每日一题 - 768. 最多能完成排序的块 I and II
96 0
【八月】 每日一题 - 768. 最多能完成排序的块 I and II
|
存储 人工智能
PAT-2021年秋季考试 乙级 7-4 数组与链表 (20 分)
让我们来设计这样一种数组与链表结合的整数存储的结构 A
137 0
|
算法 程序员
【算法合集】学习算法第一天(链表篇)
哈喽,大家好,我是程序猿追,众所周知算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。无论在我们面试还是笔试算法是必不可少的,我们打开某招聘网站,发现薪资待遇都很友好。
109 0
【算法合集】学习算法第一天(链表篇)
算法每日一题——第三天——完美数
算法每日一题——第三天——完美数
算法每日一题——第三天——完美数
|
C语言
洛谷每日三题--第二天
洛谷每日三题--第二天