链表基础

链表的定义:链表是一种动态的数据结构。它是动态进行存储分配的一种结构。

 链表具有的特点:

            在链表中,所有元素都分别保存在一个具有相同数据结构的节点中,节点是链表的基本存储单位,一个节点与一个数据元素对应。每个节点在内存中使用一块连续的存储空间,每个节点可以使用不连续的存储空间,节点通过指针连载一起,链接节点的指针叫链。


节点定义采用结构体类型:

struct node                                                    typedef struct node

 {                                                                      {

datatype data;                                                     datatype data;

struct node *link;                                                 struct node *link;

};                                                                      }NODE; ------------->可以有个指针 如 *PNODE


可以有多个不同的datatype data,

链表的组成成员包括:头指针,表头节点,数据节点。


链表的创建方法一:在最后一个节点的尾部添加节点,输出的时候就是先进先出了


typedef struct node
   {   
      char pdata[20];
      struct node *pnext;
  }NODE;

  //NODE *head;如果在这里定义head的话,编译没有问题,但是运行的时候会出现内存使用不当的错误,所以head在main函数中定义。
  void create_node_fun(NODE *phead)
  {
      int len,i;
      char st[20];
      NODE *ptail = phead;     //ptail始终指向链尾
      NODE *p;
      printf("please input node len = ");
      scanf("%d",&len);          //确定链表的长度
      for(i=0;i<len;i++)
      {
          p = (NODE *)malloc(sizeof(NODE));//申请一个数据节点
          if(p == NULL)              //判断申请节点是否成功
          {
              printf("p == NULL,error!!");
              exit(-1);

           }
          else
         {
              scanf("%s",st);      //应该可以直接输入到p->pdata中去的,没试过
              strcpy(p->pdata,st);

       
              ptail->pnext = p;     
              p->pnext = NULL;
              ptail = p;     
         //这三行代码基本上是固定的套路,一般来说可以直接套用就可以了
         }
      }
  }
创建链表方法二:一直都是在表头的尾部插入新的节点,输出的时候就是后进先出了

typedef struct node
   {   
      int data;
      struct node *link;
  }NODE;
  
 
  void create_node_fun(int n)
  {
     int i;

     NODE *head;
     head = (NODE*)malloc(sizeof(NODE));
     if(head == NULL)
      {
         printf("head==NULL,error!!!");
          exit(-1);
      }
      head->data = 0;
      head->link = NULL;
      NODE *p = NULL;
      NODE *ptail = NULL;
      ptail = head;
      for(i = 0;i < n;i++)

      {
         p = (NODE *)malloc(sizeof(NODE));//这里也是需要判断p是否申请空间成功,否则出现错误难找。
         p->data = i;


         p->link = head->link;
         head->link = p; //这两句基本是固定的套路,可以直接套用

      }

}
 

链表的输出方式一:

void printf_node_fun(NODE *head)
  {
   phea (NODE *)malloc(sizeof(NODE));
      
     NODE *p = head;
     while(p!=NULL)
      {
          printf("%s\n",p->pdata);
          p = p->pnext;
      }
 }

链表的输出方式二:

void printf_node_fun(NODE *head)
 {
    NODE *p = NULL;

     p = head;
     if(head != NULL)
         do
         {
             printf("%d",p->data);
             p = p->link;
          }while(p!=NULL);
 }

其实这两种输出方法都一样,只不过循环方式不一样。



用完链表之后还有一个函数,那就是销毁链表的函数:
void destroy_node_fun(NODE *head)
  {
      NODE *p,*q;
      p = head;
      q = head->pnext;
      while(p!=NULL)
      {
          free(p);
          p = q;
          if(q!=NULL)
              q=q->pnext;
     }
 
  }
销毁函数可以直接拿来套用,没什么技巧。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值