• 单链表的算法设计


    当学习完单链表后,仔细回忆回忆,单链表还是很容易掌握的,但是还是要仔细认真的品味。

    单链表可以看做是由若干个结点由指针指向后继结点一种表.
    结点是由数据域指针域构成。真正有效的存储是数据域,指针域负责指向下一个结点存储的位置,所以它的存储密度都是小于1,而之前学习的顺序表存储密度都是1.
    那么如何定义结构体

    1
    2
    3
    4
    5
    typedef struct 
    {
    Eletype data;
    struct *next;//指针域
    }node,*Node;

    那么单链表具体可以做些什么操作哪?

    1. 初始化操作,主要是对于头结点来说的,头结点一般不存储数据

      1
      2
      3
      4
      5
      void initnNode(Node head)
      {
      head=(Node)malloc(sizeof(node));
      head->next=null;
      }
    2. 插入结点操作,插入分为两种,头插法和尾插法

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      void insertData(Node head,int data)
      {
      Node temp=(Node)malloc(sizeof(node));
      temp->data=data;

      temp->next=head->next;
      head->next=temp;//时间复杂度为O(1)
      #else//尾插法
      Node p;
      p=head;
      while(p->next!=NULL)//时间复杂度为O(n)此处不能用p来进行判断,若p为尾结点的话也符合条件,但是进入循环后就不符合和会发生野指针的情况
      {
      p=p->next;
      }
      p->next=temp;
      temp->next=NULL;
      }
    3. 查找结点操作,由于单链表需要用指针进行移动,所以不能用二分法(假设存储的数据是有顺序的)进行查找

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      void findData(Node head,int data)
      {
      Node p;
      p=head;
      while(p!=NULL)
      {
      if(p->data==data)
      {
      printf("已找到数据");
      break;//退出循环
      }
      else
      {
      p=p->next;
      if(p==NULL) 大专栏  单链表的算法设计
      {
      printf("未找到该数据");
      }
      }
      }
      }
    4. 删除结点

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      void deleteData(Node head,int data)
      {
      Node p;
      p=head;
      while(p!=NULL)
      {
      Node temp;
      if(p->data==data)
      {
      temp=p->next;
      p->next=p->next->next;
      free(temp);//释放出删除的结点空间
      }
      else
      {
      p=p->next;
      }
      }
      }
    5. 删除单链表中的最大值结点

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      void delMaxNode(Node head)
      {
      Node p=head->next;
      Node pre=head;//p和pre是同步运动的
      Node maxp=p;
      Node maxpre=pre;
      which(p!=NULL)
      {
      if(maxp->data<p->data)
      {
      maxp=p;
      maxpre=pre;//最大值的前驱
      }
      pre=p;
      p=p->next;
      }
      maxpre->next=maxp->next;
      free(maxp);
      }
    6. 结点有序递增

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      void sort(Node head)
      {
      Node p,pre,q;
      p=head->next->next;//p指向L的第二个数据结点
      head->next->next=NULL;//构造只含一个数据结点的有序表
      while(p!=NULL)
      {
      q=p->next;
      pre=head;
      while(pre->next!=NULL&&pre->next->data<p->data)
      {
      pre=pre->next;
      }
      p->next=pre->next;
      pre->next=p;
      p=q;
      }
      }

    解释如下图
    解释

  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12251231.html
Copyright © 2020-2023  润新知