美文网首页算法程序员
链表的插入和删除

链表的插入和删除

作者: zl520k | 来源:发表于2018-03-28 16:53 被阅读12次

链表插入是在找到元素的前面插入数据,如果没有找到,就不能插入元素。

链表删除是删除找到的元素。

如果想在每一次的随机函数中,得到的数据不一样,可以使用sleep(10)函数,模拟随机数

struct node{

    int data;

    struct node *next;

};

typedef struct node* NODEP;

typedef struct node NODE;

void createLink(void);

void initNodeData(NODEP node);

void print(NODEP node);

void freeNode(NODEP node);

void insertNode(NODEP node);

NODEP deleteNode(NODEP node);

NODEP insertSearchNode(NODEP node,int element);

NODEP deleteSearchNode(NODEP node,int element);

#define kLen 10

static inline int dataFunction(){

    srand((unsigned int)time(NULL));

    int temp = rand()%12+1;

    return temp;

}

void initNodeData(NODEP node){

    NODEP p = node;

    NODEP q = NULL;

     int a[13] = {0};

    for (int i = 0; i < kLen; ++i) {

        int temp = rand()%12+1;

        if (a[temp]) {

            --i;

            continue;

        }

        a[temp] = 1;

        if (i == 0) {

            p->data = temp;

            p->next = q;

        }

        else{

            q = malloc(sizeof(NODE));

            q->data = temp;

            q->next = p->next;

            p->next = q;

            p = q;

        }

    }

}

void createLink(void){

    NODEP node = malloc(sizeof(NODE));

    assert(node);

    initNodeData(node);

    printf("\n");

    print(node);

    printf("\n");

    insertNode(node);

    print(node);

    printf("\n");

    node = deleteNode(node);

    print(node);

    printf("\n");

}

NODEP insertSearchNode(NODEP node,int element){

    assert(node);

    NODEP p = node;

    NODEP q = NULL;

    for (;p;q = p,p = p->next) {

        if (p->data == element) {

            break;

        }

    }

    return q;

}

void insertNode(NODEP node){

    assert(node);

    int temp = 2;//dataFunction();

    printf("%d ",temp);

    int data = dataFunction();

    printf("%d \n",data);

    NODEP p = insertSearchNode(node, temp);

    if (p) {

        NODEP q = malloc(sizeof(NODE));

        assert(q);

        q->data = data;

        q->next = p->next;

        p->next = q;

    }

    else{

        printf("no search data\n");

    }

}

NODEP deleteSearchNode(NODEP node,int element){

    assert(node);

    NODEP p = node;

    NODEP q = NULL;

    int flag = 0;

    for (;p;q = p,p = p->next) {

        if (p->data == element) {

            flag = 1;

            break;

        }

    }

if (flag) {

        if (q == NULL) {

            q = node;

        }

    }

    else if (!flag){

        q = NULL;

    }

    return q;

}

NODEP deleteNode(NODEP node){

    assert(node);

    int temp = dataFunction();

    printf("temp:%d \n",temp);

    NODEP p = deleteSearchNode(node, temp);

    if (p) {

        NODEP q = NULL;

        if (p != node) {

            q = p->next;

            if (q)

            {

                p->next = p->next->next;

                free(q);

                return node;

            }

            else{

                printf("no search data\n");

                return NULL;

            }

        }

        else {

            q = p;

            node = p->next;

            free(q);

            return node;

        }

    }

    else{

        printf("no search data\n");

        return NULL;

    }

}

void print(NODEP node){

    NODEP p = node;

    for (;p;p = p->next) {

        printf("%d ",p->data);

    }

    printf("\n");

}

void freeNode(NODEP node){

    NODEP p = node;

    NODEP q = p;

    for (;p;) {

        printf("%d ",p->data);

        p = p->next;

        free(q);

        q = p;

    }

}

相关文章

  • 数据结构之链表及其栈和队列的实现

    链表的基本操作 定义 从链表头部插入元素 从链表头部删除元素 从链表尾部插入元素 从中间插入和删除结点 栈和对列的...

  • 19.数据结构-线性表-2.单链表增加和删除

    0>>>初始化和创建 1>>>单链表的插入和删除。 1.单链表的插入 2.单链表的删除 2>>>单链表的整表创建和...

  • python数据结构——单链表

    链表 python实现链表链表的初始化创建元素的插入和删除链表的遍历元素的查询链表的删除链表的逆序判断链表是否有环...

  • 链表的插入和删除

    链表插入是在找到元素的前面插入数据,如果没有找到,就不能插入元素。 链表删除是删除找到的元素。 如果想在每一次的随...

  • 数据结构动画描述

    数组 插入数组插入 删除数组删除 链表 栈 队列 二分搜索树 插入

  • 双向链表&双向循环链表

    一、双向链表 带有前驱结点、后区节点 双向链表的创建 双向链表插入-逻辑 双向链表删除 删除双向链表指定的元素 二...

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 基于linklist 的 cache

    练习下 链表的插入 删除插入数据的时候做缓存

  • 数据结构之链表

    链表分为单链表,双向链表和循环链表 链表的时间复杂度 插入 O(n) 删除 O(1) 随机访问 O(n) 单双链表...

  • 单向循环链表

    结构体 链表创建 插入 删除 打印

网友评论

    本文标题:链表的插入和删除

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