Menu Close

单链表

什么是链表:

链表是由结构体和指针构成的,其中的结构体内包含了两个部分(数据域和指针域)。链表是由一个个的节点构成的,节点分为两类(头结点和一般节点。顾名思义;头结点就是标记着链表开头的节点,所以它的作用就是用来标记,因此头结点是没有数据域的)。
链表
链表
如何定义一个链表:
接下来逐一分开解释:
链表是由结构体和指针构成的,包括数据域和指针域!
struct linknode
{
       int data; //数据域
       struct list *next; //指针域
};
我们给这个链表起名叫linknode,并且定义了ta的结构体,在学习结构体的时候,我们都知道,只有结构体变量才能使用结构体。
typedef struct linknode linklist;
我推荐使用这种定义结构体变量,因为在我的理解中,typedef用于给变量起一个另外的名字,但凡定义了一个别名,那么你在使用的时候,只需要打出linklist p,就可以给定义一个对象p,
链表的初始化:
int linklist( linklist **lnode )
{
       *lnode = (linklist)malloc(sizeof(linklist)); //在初始化函数中 *lnode 和主函数中 l 是一样的,对于*lnode分配空间就是等同于对主函数中的 l 分配空间。
        if ( !*lnode )
       {
              return 0; //如果空间开辟失败,直接return掉!
        }
      ( *lnode )->next = NULL;
}
void main()
{
        linklist *l;
        initlinklist( &l );
}
知识点:为啥初始化函数中要使用二级指针?
因为操作者在使用链表的时候使用的是头结点,所以在初始化函数中生成的头结点,主函数中的 l 指向的初始化函数中的头结点(之所以使用头结点,就是给操作者一个使用链表的起点)
链表的插入:
插入一个节点就在于,一般用两到三个结构体指针变量和一个循环结构。
insertlinklist( linklist *lnode )
{
       linklist *list,*temp;
       int number;
      {
      scanf( “%d”,&number );
      if ( number == -9999)
       {
               break;
       }
       list = Inode -> next; //list指向头结点;
       while ( list )
       {
               list = list -> next; //通过while循环和指针变量list定位要插入的节点temp的位置。
       }
       temp = (linklist)malloc(sizeof(linklist));
       if ( !temp )
       {
              printf( “malloc temp is failure!\n” );
              return 0;
        }
       temp -> data = number; //给节点temp填充数据域。
       temp -> data = list -> next; //给节点temp填充指针域。
       list -> next = temp; //将定位好的list指针指向修改为指向temp。
        }while(-9999);
}
int main()
{
      linklist *I;
      initlinklist(&I); //生成一个头结点。
      insertlinklist(I); //插入节点。
      return 0;
}
链表的删除:
删除链表节点就在于,一般用到三个结构体指针变量和一个循环结构。
deletelinlist( linklist *Inode )
{
        linklist *list,*temp;
        list = Inode -> next; // 指向头节点。
        while( list )
       {
                 temp = list -> next; //temp指向当前节点的下一个节点。
                 free(list); //释放当前节点。
                 list = temp; //list指向下一个节点。
       }
}
int main()
{
       linklist *I;
       initlinklist(&I);
      deletelinklist(I);
      return 0;
}
链表的长度:
lengthlinklist(linklist *Inode)
{
       linklist *list;
       list = Inode -> next;
       int number = 0;
       while (list)
       {
               list = list -> next;
              number++;
        }
       printf(“%d\n”,number);
}
int main()
{
       linklist *I;
       initlinklist(&I);
       lengthlinklist(I);
       return 0;
}
结尾:
以后会更加注重部分基础知识的解读,要有花一万小时来重复基础知识的决心!
Posted in C语言, C语言

发表评论

相关链接