链表(linked list )

作者: AceKitty | 来源:发表于2016-12-31 10:32 被阅读106次

定义:

链表是一种物理存储单元上非连续、非顺序的存储结构。

特点:

  1. n个节点离散分配
  2. 彼此通过指针相连
  3. 每个节点只有一个前驱节点,每个节点有一个后续节点
  4. 首节点没有前驱节点,尾节点没有后续节点

专业术语:

首节点:第一个有效的节点
尾节点:最后一个有效的节点
头节点:第一个有效节点之前的那个节点,头节点并不存放有效数据,加头节点的目的就是为了方便对链表的操作,头节点的数据类型跟首节点数据类型一样
头指针:指向头节点的指针变量
尾指针:指向尾节点的指针变量

如果要通过一个函数来对链表进行处理,我们至少要接收链表的哪些参数:
只需要一个参数:头指针 因为我们可以通过头指针可以推算出链表的其他所有信息

分类:

单链表
双链表: 每一个节点有两个指针域
循环链表:能通过任何一个节点找到其他任何节点
非循环链表

算法:

遍历,查找,清空,销毁,求长度,排序,删除节点,插入节点

狭义的算法是与数据存储方式密切相关的
广义的算法是与数据存储无关
泛型:利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的

链表的优缺点:

优点:空间没有限制,插入删除元素的速度快
缺点:存储速度慢  

链表的算法实现(C语言)

#import <Foundation/Foundation.h>

#include <stdlib.h>

//链表节点的定义
typedef struct Node {
    int data;
    struct Node *pNext;
} NODE, *PNODE;

//创建节点
PNODE create_list(void);
//遍历链表
void traverse_list(PNODE pNode);
//判断链表是否为空
bool is_empty(PNODE pHead);
//求链表的长度
int length_list(PNODE);
//在链表中插入节点
bool insert_list(PNODE, int, int);
//在链表中删除节点
bool delete_list(PNODE, int, int *);
//链表排序
void sort_list(PNODE);

int main() {
    PNODE pHead = NULL;
    pHead = create_list();
    
    sort_list(pHead);
    
    insert_list(pHead, 2, 4);
    
    int pVal;
    if (delete_list(pHead, 3, &pVal)) {
        printf("删除成功\n");
    } else {
        printf("删除失败\n");
    }
    
    traverse_list(pHead);
    
    int len = length_list(pHead);
    printf("链表的长度:%d\n", len);
    
    if (is_empty(pHead)) {
        printf("链表为空!\n");
     } else {
        printf("链表不为空!\n");
     }
    
    sort_list(pHead);
    printf("排序后:\n");
    traverse_list(pHead);
    
    return 0;
}

PNODE create_list(void) {
    int len;
    int i;
    int val;
    PNODE pHead = (PNODE)malloc(sizeof(PNODE));
    if (pHead == NULL)
    {
        printf("分配失败,程序终止!\n");
        exit(-1);
    }
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    
    printf("请输入您需要生成的链表节点的个数:len = ");
    scanf("%d", &len);
    for (i = 0; i < len; ++i) {
        printf("请输入第%d个节点的值", i + 1);
        scanf("%d", &val);
        PNODE pNew = (PNODE)malloc(sizeof(PNODE));
        if (pNew == NULL) {
            printf("分配失败,程序终止!\n");
            exit(-1);
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    return pHead;
}

void traverse_list(PNODE pHead) {
    PNODE p = pHead->pNext;
    while (NULL != p)
    {
        printf("===%d\n", p->data);
        p = p->pNext;
    }
}

bool is_empty(PNODE pHead) {
    return pHead->pNext == NULL;
}

int length_list(PNODE pHead) {
    
    PNODE p = pHead->pNext;
    int len = 0;
    while (NULL != p)
    {
        ++len;
        p = p->pNext;
    }
    return len;
}

void sort_list(PNODE pHead) {
    int i, j, t;
    int len = length_list(pHead);
    PNODE p, q;
    
    for (i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext)
    {
        for (j = i + 1, q = p->pNext; j < len; ++j, q = q->pNext)
        {
            if (p->data > q->data)
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
        }
    }
}
//在pHead所指向链表的第pos个节点的前面插入一个新的节点,该节点的值是val,并且该值是从1开始
bool insert_list(PNODE pHead, int pos, int val) {
    int i = 0;
    PNODE p = pHead;
    while (NULL != p && i < pos - 1)
    {
        p = p->pNext;
        ++i;
    }
    if (i > pos - 1 || NULL == p) {
        return false;
    }
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
    {
        printf("动态分配内存失败!\n");
        exit(-1);
    }
    pNew->data = val;
    PNODE q = p->pNext;
    p->pNext = pNew;
    pNew->pNext = q;
    return true;
}

bool delete_list(PNODE pHead, int pos, int *pVal) {
    int i = 0;
    PNODE p = pHead;
    while (NULL != p->pNext && i < pos - 1)
    {
        p = p->pNext;
        ++i;
    }
    if (i > pos - 1 || NULL == p->pNext) {
        return false;
    } 
    PNODE q = p->pNext;
    *pVal = q->data;
    //删除p节点后面的节点
    p->pNext = p->pNext->pNext;
    //free(q);
    q = NULL;
    return true;
}

相关文章

  • LeetCode题集-链表

    链表逆序 206. Reverse Linked List 92. Reverse Linked List II ...

  • 怎样应对IT面试与笔试-(十五)

    Linked List 链表 141. Linked List Cycle 判断单链表中是否有环 使用到的数据结...

  • Linked List Cycle II

    Linked List Cycle II 今天是一道有关链表的题目,是Linked List Cycle(回复02...

  • 链表(Linked List)

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列...

  • 链表(linked list )

    定义: 链表是一种物理存储单元上非连续、非顺序的存储结构。 特点: n个节点离散分配 彼此通过指针相连 每个节点只...

  • linked list 链表

    链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由...

  • 链表(Linked List)

    什么是链表? 通过指针或者引用将一系列数据节点串起来的数据结构称为链表,链表数据结构与数组最明显的区别就是它在内存...

  • 链表(Linked List)

    在分析链表之前,我们先来对之前的动态数组、栈、队列总结一下:(1)底层依托于静态数组(2)依靠resize解决固定...

  • 链表 Linked List

    链表和动态数组的比较 动态数组回造成内存空间的大量浪费 链表可以做到用多少内存就申请多少内存 链表 是一种链式存储...

  • Leetcode【61、82、83、142、143、1171】

    问题描述:【Linked List】61. Rotate List 解题思路: 这道题是给一个链表,旋转链表,将链...

网友评论

    本文标题:链表(linked list )

    本文链接:https://www.haomeiwen.com/subject/rlpvvttx.html