码迷,mamicode.com
首页 > 编程语言 > 详细

单链表的算法设计

时间:2020-02-02 12:13:58      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:顺序表   delete   结构体   掌握   复杂   int   elm   退出   function   

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

单链表可以看做是由若干个结点由指针指向后继结点一种表.
结点是由数据域指针域构成。真正有效的存储是数据域,指针域负责指向下一个结点存储的位置,所以它的存储密度都是小于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;
    }
    }

解释如下图
技术图片

单链表的算法设计

标签:顺序表   delete   结构体   掌握   复杂   int   elm   退出   function   

原文地址:https://www.cnblogs.com/lijianming180/p/12251231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!