美文网首页
线性表的单向链表实现

线性表的单向链表实现

作者: Sivin | 来源:发表于2018-04-06 13:41 被阅读13次

线性表的实现方式有很多,可以选择,数组实现,也可以选择链表实现,同时,链表实现上又可以分两种:
一种是单向链表,一种是双向链表.
本篇我们选择单向链表来实现:

#include <stdio.h>
#include <stdlib.h>


typedef int ElementType;
typedef struct Node {
    ElementType data;
    struct Node *pre; //若果有这个指针域,表示的是双向链表
    struct Node *next;//单独有一个指针域表示的是单向链表
} *PNode;

//声明一个线性表类型
typedef PNode List;


/**
 * 查找线性表里指定位置上的数据
 * @param pos
 * @param L
 * @return
 */
PNode findPNode(int pos, List L) {
    List p = L;
    if (p == NULL) return NULL;
    int i = 0;
    while (p != NULL && i < pos) {
        i++;
        p = p->next;
    }
    return p;
}

/**
 * 在线性表指定位置上插入一个数据
 * 这个是单向链表的实现,如果是双向链表的实现,就少了一步查找
 * @param e
 * @param pos
 * @param L
 * @return 返回插入完成之后链表的头指针
 */
List insertData(ElementType e, int pos, List L) {
    List s;
    if (pos < 0) {
        printf("插入位置有误\n");
        return L;
    }
    if (pos == 0) {
        s = (List) malloc(sizeof(struct Node));
        s->data = e;
        s->data = L;
        return s;
    }
    PNode preNode = findPNode(pos - 1, L);
    if (preNode == NULL) {
        return NULL;
    }
    s = (PNode) malloc(sizeof(struct Node));
    s->data = e;
    s->next = preNode->next;
    preNode->next = s;
    return L;
}

//删除方法
List deleteNode(int pos, List L) {

    if (pos < 0 || L == NULL) {
        printf("删除失败\n");
        return L;
    }
    if (pos == 0) {
       PNode deleteNode = L;
        L = L->next;
        free(deleteNode);
        return L;
    }

    //找到要删除节点的上一个节点
    PNode preNode =  findPNode(pos - 1, L);

    if(preNode == NULL){
        printf("删除位置有误\n");
        return L;
    }

    PNode deleteNode = preNode->next;
    if(deleteNode == NULL){
        printf("没有要删除的节点\n");
        return L;
    }
    preNode->next = deleteNode->next;
    free(deleteNode);
    printf("删除成功\n");
    return L;
}

测试代码:

int main() {
    //定义并初始化一个线性表
    List L = NULL;

    for (int i = 0; i < 10; i++) {
        L = insertData(i * 2, i, L);
    }
    printf("-----------打印线性表数据-------------\n");
    PNode p = L;
    for (int i = 0; i < 10; i++) {
        if(p == NULL) break;
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n-----------开始删除节点-------------\n");
    deleteNode(5,L);
     p = L;
    for (int i = 0; i < 10; i++) {
        if(p == NULL) break;
        printf("%d\t", p->data);
        p = p->next;
    }
    return 0;
}

相关文章

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 线性表的单向链表实现

    线性表的实现方式有很多,可以选择,数组实现,也可以选择链表实现,同时,链表实现上又可以分两种:一种是单向链表,一种...

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 数据结构-单向链表

    一、线性表 线性表可以分为: 顺序表(数组) 链表(单向链表、双向链表、循环链表) 二、链表 链表是一种链式存储的...

  • 数据结构与算法-线性表

    1 单向链表 1.1 线性表-单链表节点长相如下图: 1.2 线性表-单链表逻辑结构如下图: 1.3 线性表-单链...

  • 数据结构和算法(三)双向链表与双向循环链表的实现

    数据结构和算法(一)线性表实现 数据结构和算法(二)单向循环链表的创建插入删除实现 数据结构和算法(三)双向链表与...

  • 数据结构和算法(五)栈的操作和实现

    数据结构和算法(一)线性表实现 数据结构和算法(二)单向循环链表的创建插入删除实现 数据结构和算法(三)双向链表与...

  • 数据结构和算法(四)链表相关面试题

    数据结构和算法(一)线性表实现 数据结构和算法(二)单向循环链表的创建插入删除实现 数据结构和算法(三)双向链表与...

  • 数据结构和算法(6)队列的操作和实现

    数据结构和算法(1)线性表实现 数据结构和算法(2)单向循环链表的创建插入删除实现 数据结构和算法(3)双向链表与...

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

网友评论

      本文标题:线性表的单向链表实现

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