zoukankan      html  css  js  c++  java
  • C/C++版数据结构之链表<一>

          链表主要就单链表、循环链表和双向链表3种链表进行讨论。

    一、单链表

         概念:所谓单链表,是指数据结点是单向排列的。一个单链表结点,其结构类型分为两部分:

                 (1)数据域:用于存储数据元素的值。

                 (2)指针域(链域):用于存储下一个结点地址或者说指向其直接后继结点的指针。

         算法:

    一般声明3个指针来操作链表:

    head:用来指向链表的头部。链表需要一个指针来标识链表,这就是头指针。

    p1:用来指向新结点,以及用来遍历链表的每一个结点。

    p2:用来指向当前结点。

    (1)单链表创建算法

    创建结点数目为n的链表:

    #include <malloc.h>

    typedef struct node
    {
    int num; //数值域
    struct node *next; //指针域
    }stud;

    stud* Create(int n)
    {
    stud *head,*p1,*p2;
    head=p1=p2=NULL;
    for(int i=0;i<n;i++)
    {
    p1=(stud*)malloc(sizeof(stud));
    p1->num=i;
    if(i==0)
    {
    head=p1;
    }
    else
    {
    p2->next=p1;
    }
    p2=p1;
    }
    p2->next=NULL;
    return head;
    }

     

     (2)单链表的查找算法

    在头指针为head的单链表中查找i:

    typedef struct node
    {
    int num;
    struct node *next;
    }stud;

    stud* Find(stud *head,int i)
    {
    stud *p1; //遍历链表指针
    p1=head;
    while(p1!=NULL)
    {
    if(i==p1->num)
    {
    break;
    }
    else
    {
    p1=p1->next;
    }
    }
    return p1;
    }

    (3)单链表删除算法

    在头指针为head的单链表中删除i:

    #include <malloc.h>

    typedef struct node
    {
    int num;
    struct node *next;
    }stud;

    bool Delete(stud *head,int i)
    {
    bool flag=false;
    if(head) //不是空链表
    {
    stud *p1,*p2;
    p1=head;
    while(p1->num!=i && p1->next!=NULL)
    {
    p2=p1;
    p1=p1->next;
    }
    if(p1->num==i)
    {
    if(p1==head)
    {
    head=head->next;
    }
    else
    {
    p2->next=p1->next;
    }
    free(p1); //释放已经脱离链表的结点内存
    flag=true;
    }
    }
    return flag;
    }



    (4)单链表插入算法

    在头指针为head的单链表中插入结点p:(假设这是一个由小到大排序的有序链表)

    typedef struct node
    {
    int num;
    struct node *next;
    }stud;

    stud* Insert(stud *head,stud *p)
    {
    stud *p1,*p2;
    p1=head;

    if(!head)
    {
    head=p;
    head->next=NULL;
    }
    else
    {
    while(p->num > p1->num && p1->next!=NULL)
    {
    p2=p1;
    p1=p1->next;
    }
    if(p->num < p1->num)
    {
    if(head==p1)
    {

    head=p;
    p->next=head;
    }
    else
    {
    //把p插入p2和p1之间
    p2->next=p;
    p->next=p1;
    }
    }
    else
    {
    //把p插入链表的尾部,此时p1指向尾部结点
    p1->next=p;
    p->next=NULL;
    }
    }
    return head;
    }

    相关文章:

      •  C/C++版数据结构之链表<一>

      •  C/C++版数据结构之链表<二>

      •  C/C++版数据结构之链表<三>



     

  • 相关阅读:
    JavaScript Date对象和函数 (一)
    Css3 文字渐变整理(一)
    Asp.net Core CacheHelper 通用缓存帮助类
    .net core中使用GB2312编码的问题
    苹果手机微信浏览器select标签选择完成之后页面不会自动回到原位
    .Net Core NOPI操作word(二) 表格操作
    .Net Core NOPI操作word(一)
    .NetCore中EFCore的使用整理(三)-关联表操作
    windos server2012安装.net core 2.2问题
    C# 最简单的使程序单进程运行的方法
  • 原文地址:https://www.cnblogs.com/danshui/p/2306590.html
Copyright © 2011-2022 走看看