回顾链表

Posted kailicard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回顾链表相关的知识,希望对你有一定的参考价值。

这两天有点累,博客的更新的速度有点慢,准确的来说是自己有点精力分散在其他方面,话不多说,进入正题:

再数据结构中,链表算是比较初级的东西,所谓链表,可以看做数组的变形,我们可以利用数组先来模拟链表,首先我们需要先理解下链表的结构,链表可以理解下面这样

2018-05-24_224745

我们首先开辟出一块空间来存储一系列的数字,但是这些数字存储的地方含有指向下一个数的指针,这些在c语言中可以用结构体来完成;代码部分如下

struct node
{
 int  data;
 struct node * next;
};

上述代码定义了一个结构体,用来完成链表的连接;

struct node *head,*p,*q,*t;    //定义一些指针来完成的链表的连接

关于这些参数的使用,我们可以参照下面的例子

for(i=1;i<=n;i++)
    {
       scanf("%d",&a);
       p=(struct node *)malloc(sizeof(struct node)); //开辟动态空间完成存储
       p->data=a;
       p->next=NULL;      ///设置当前头指针为空
       if(head==NULL)
            head=p;        //头指针为空指向p;
       else
           q->next=p;      //头指针非空,q->next指向链表的下一个节点
       q=p;    
    }

链表中常用有插入和删除操作,我们在这里介绍下插入操作,关于删除,大家可以自己思考下,我的链表的事按照正序来输入的,所以在比较非常简单,我们需要查找比输入的数字大的数,然后在这个节点位置进行插入和移动操作就行了

scanf("%d",&a);         //需要插入的
   t=head;
   while(t!=NULL)                  //while 循环进行遍历
   {
     if(t->next->data>a)
     {
       p=(struct node *)malloc(sizeof(struct node)); 
       p->data=a;                           //查找出节点后当前节点赋值a
       p->next=t->next;                 
       t->next=p;                          //原来节点后移
       break; 
     
     }
      t=t->next;
   }

接下来献上完整代码

#include<stdio.h>
#include<stdlib.h>
struct node
{
 int  data;
 struct node * next;
};
int main()
{
    struct node *head,*p,*q,*t;
    int n,i,a;
    scanf("%d",&n);
    head=NULL;
    for(i=1;i<=n;i++)
    {
       scanf("%d",&a);
       p=(struct node *)malloc(sizeof(struct node));
       p->data=a;
       p->next=NULL;      ///设置当前头指针为空
       if(head==NULL)
            head=p;        //头指针为空指向p;
       else
           q->next=p;
       q=p;    
    }
   scanf("%d",&a);
   t=head;
   while(t!=NULL)
   {
     if(t->next->data>a)
     {
       p=(struct node *)malloc(sizeof(struct node));
       p->data=a;
       p->next=t->next;
       t->next=p;
       break;
     
     }
      t=t->next;
   }
   t=head;
   while(t!=NULL)
   {
   printf("%d ",t->data);
   t=t->next;
   }
   return 0;

}

上面的代码已经完成了链表的基本操作,下面我们考虑用数组来完成,用数组完成我们就需要两个数组来分别存储当前节点值和节点连接信息,由于二者原理大同小异,我在这里不多做赘述,直接贴代码

#include<stdio.h>
int main()
{
  int data[101],right[101];
  int i,n,len,t;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
      scanf("%d",&data[i]);
  len=n;
  for(i=1;i<=n;i++)
  {
    if(i!=n)
        right[i]=i+1;
    else
        right[i]=0;
  }
  len++;
  scanf("%d",&data[len]);
  t=1;
  while(t!=0)
  {
     if(data[right[t]]>data[len])
     {  
         right[len]=right[t];         //新插入插入节点的标号等于的当前节点的下一个节点编号
         right[t]=len;                //当前节点的的下一个节点就是插入数的编号
          break;                       //插入完成退出循环
     }
     t=right[t];
  }
  t=1;
  while(t!=0)
  {  printf("%d",data[t]);
     t=right[t]; 
  }

 return 0;
}

以上是关于回顾链表的主要内容,如果未能解决你的问题,请参考以下文章

Java基础回顾小练(基于链表实现一个IntLinkedList)

链表补充知识,回顾大一

数据结构 栈(顺序表和链表实现) 回顾练习

C语言反转单向链表的代码

JavaScript笔试题(js高级代码片段)

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段