22号数据结构链表

链表

链表:线性表的链式存储,称为链表

逻辑结构:线性结构(一对一)

存储结构:链式存储(使用任意一段存储空间实现的存储形式)

链表特点:逻辑相邻,物理不一定相邻

链表分类:单向链表、单向循环链表、双向链表、双向循环链表

引入目的:顺序表的插入和删除时间复杂度是O(n),需要移动大量元素,效率低,

并且顺序表存在满的情况,引出链表,插入和删除不需要移动元素。

单向链表

单链表的概念

1.单向链表:链表只可以单向遍历

2.认识节点:

单向链表的节点:数据域、指针域

数据域:存储数据元素

指针域:节点之间的关系(下一个节点的地址)

单链表的操作

单向链表节点创建

Linklist create_node()

{

        Linklist p=(Linklist)malloc(sizeof(struct Node));

        if(NULL ==p) return NULL;

        //对p的数据域和指针域进行初始化

         p->data=0;

         p->next=NULL;

         return p;

}

单向链表头插

Linklist insert_head(Linklist head,datatype element)

{ //创建新节点s

        Linklist s=create_node();

        if(NULL ==s) return head;

        s->data=element; //s的指针域

           s->next=head;

         head=s;

           return head;

}

单向链表尾插

Linklist insert_rear(Linklist head,datatype element)

{ //创建新节点 

               Linklist s=create_node();

               if(NULL ==s)

               return head;

               s->data=element;

               //1判断链表是否为空

                 if(NULL ==head)

                 { head=s; }

                else

                { //2,找到最后一个节点

                     Linklist p=head;

                    while(p->next!=NULL)

                       { p=p->next; }

                //3,在p的后继插入s

                          p->next=s;

                  } 

                   return head;

}

单向链表头删

Linklist delete_head(Linklist head)

{ //1.判断链表是否为空格

       if(NULL ==head)

        return head;

          //2,存在节点 >=1

          Linklist del=head;

          head=head->next;

          free(del);

           del=NULL;

           return head;

}

单向链表尾删

Linklist delete_rear(Linklist head)

{ if(head==NULL)

return head;

//2,判断只有一个节点

if(head->next==NULL)

{ free(head);head=NULL; }

//3,存在多个节点 >=2

//找到倒数第二节点

Linklist p=head;

while(p->next->next!=NULL)

{       

              p=p->next;

}

free(p->next);

p->next=NULL;

return head;

}

单向链表遍历

void output(Linklist head)

{ //1.判断链表是否为空

         if(NULL==head) return;

           //2,循环输出

           Linklist p=head;

            while(p!=NULL)

         {

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

                  p=p->next;

          } puts("");

 }

   

单向链表任意位置插入+计算长度

计算长度

int length(Linklist head)

{ Linklist p=head; int count=0;

     while(p!=NULL)

{   

     p=p->next;

      count++;

}

return count;

任意位置插入

 Linklist insert_pos(Linklist head,int pos,datatype element)

{    //1.判断位置是否合法

        if(pos<1 || pos> length(head)+1 )

         return head;

//2,在第一个位置插入

    if(pos==1)

{

          head=insert_head(head,element);

           return head;

 }

//3,在其他位置插入

Linklist p=head;

for(int i=1;i

{           p=p->next;

}

//创建新节点s

         Linklist s=create_node();

           if(NULL ==s)

          return head;

          s->data=element;

//链接指针域

     s->next=p->next;

      p->next=s;

       return head;

}

单向链表任意元素查找

22号数据结构链表_第1张图片

单向链表任意元素修改

22号数据结构链表_第2张图片

单向链表任意元素删除

22号数据结构链表_第3张图片

单向链表逆置(面试)

22号数据结构链表_第4张图片

你可能感兴趣的:(笔记)