zoukankan      html  css  js  c++  java
  • 单链表

    程序构思:

    单链表的建立

    (1) 先建立头结点head,将头结点的指针域置为空。

    (2) 新建一个指向头结点的指针m,即Node *m = head;(首端插入方式不需要该步骤)。

    (3) 新建一个结点p,把此新结点链接到单链表的尾端(p->next设为空)或者始端。

    1⃣️首端插入方式

    ​ ①p->next指向头结点指向的下一个结点head->next。

    ​ ②head->next指向p。

    2⃣️尾端插入方式。

    ​ ①m->next指向p,即m->next = p;

    ​ ②把指针p赋值给m,也就是说每次m都要最终指向新插入的结点。m = p;

    单链表的插入

    (1) 新建一个结点p,指定插入位置。

    (2) 从单链表开始查找结点位置。

    ​ ①找到该位置,则p->next指向当前位置的下一个结点,当前位置结点指向新建结点p。

    ​ ②没有找到该位置,插入操作失败。

    单链表的删除

    (1) 指定删除位置。

    (2) 链表头开始找到结点位置。

    ​ ①找到该位置,则删除该位置的结点。

    ​ ②没有找到该位置,删除操作失败。

    示例代码

    #include <iostream>
    #include <stdlib.h>
    #include <cstdio>
    using namespace std;
     
     
     
    typedef int ElementType;    //指定单链表中数据类型
     
    //单链表存储结构定义
    typedef struct Node
    {
        ElementType data;  //数据域
        struct Node *next; //指针域
    }*LinkList;
     
    #pragma mark - 建立一个空线性表/单链表(方法一)
    /****----------------------------------------------****/
    //单链表建立方法一(函数用返回值得到表头指针)
    //函数名: CreateOne(int n)
    //参数:  (传入)int n, 传入线性表结点数量
    //作用: 建立一个空线性表
    //返回值:Node *型返回结构体指针,即得到建立的线性表头指针
    /****---------------------------------------------****/
     
    Node* CreateOne(int n)
    {
        int i;
        Node *head;  //定义头结点指针
        Node *p;     //定义新结点指针
        
        //建立带头结点的线性链表
        head = (Node*)malloc(sizeof(Node));
        head->next = NULL;
        
        cout << "Please input the data for LinkList Nodes:" << endl;
        
        /** 该链表创建并初始化采用的是从表尾插入n个元素,比如如果输入的是:1 2 3,那么输出链表时会输出3 2 1 */
        /*
        for (i = n; i > 0; i--) {
            p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一个新结点
            scanf("%d", &p->data);  //新结点赋值
            //新结点插入到表头
            p->next = head->next;
            head->next = p;
        }
         */
        
        /** 该链表创建并初始化采用的是从表头插入n个元素,比如输入的是:1 2 3, 那么输出的顺序也是会: 1 2 3 */
        Node *tempNode = head;
        for (i = n; i > 0; i--) {
            p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一个新结点
            scanf("%d", &p->data);  //新结点赋值
            //新结点插入到表尾
            tempNode->next = p;
            tempNode = p;
        }
        tempNode->next = NULL;
        return head;   //返回头结点指针,即可以得到单链表的地址
    }
     
    #pragma mark - 建立一个空线性表/单链表(方法二)
    /****----------------------------------------------****/
    //单链表建立方法二(函数无返回值)
    //函数名: CreateTwo(Node* head, int n)
    //参数: (传入)Node* head传入一个链表指针
    //     (传入)int n,传入线性表结点数量
    //作用: 建立一个空线性表
    //返回值: 无
    /****---------------------------------------------****/
     
    void CreateTwo(Node *head, int n)
    {
        int i;
        Node *p;   //定义新结点指针
        
        //建立带头结点的线性链表
        head = (LinkList)malloc(sizeof(Node));
        head->next = NULL;
        
        cout << "Please input the data for LinkList Nodes:" << endl;
        for (i = n; i > 0; i--) {
            p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一新结点
            scanf("%d", &p->data);   //为新结点赋值
            
            //新结点插入到表头
            p->next = head->next;
            head->next = p;
        }
    }
     
    #pragma mark - 向单链表中插入一个元素
    /****----------------------------------------------****/
    //函数名: InsertNode(Node *L, int i, ELementType e)
    //参数: (传入)Node *L,传入线性表头指针L
    //     (传入)int i插入位置
    //     (传入)ELementType e插入元素
    //作用: 线性表中插入一个元素
    //返回值: int型,返回1表示操作成功,0表示失败
    /****---------------------------------------------****/
    int InsertNode(Node *L, int i, ElementType e)
    {
        Node *p = L;   //定义一个指向第一个结点的指针
        int j = 0;
        
        //顺指针向后查找, 直到p指向第一个结点
        while (p && j < i) {
            p = p->next;
            j++;
        }
        
        //插入位置合法性判断
        if (!p || j > i) {
            cout << "Error! The location is illegal!"  << endl;
            return 0;
        }
        
        Node *s;
        s = (Node*)malloc(sizeof(Node));   //建立新结点
        s->data = e;    //新结点赋值
        
        //插入结点
        s->next = p->next;
        p->next = s;
        return 1;
    }
     
    #pragma mark - 删除单链表中的一个元素
    /****----------------------------------------------****/
    //函数名: DeleteNode(LinkList &L, int i, ELementType &e)
    //参数: (传入)LinkList &L,线性表头指针L的地址
    //     (传入)int i删除位置
    //     (传出)ElementType &e 存储删除节点元素的值
    //作用: 线性表中删除一个元素
    //返回值: ElementType型返回删除结点元素的值
    /****---------------------------------------------****/
    ElementType DeleteNode(LinkList &L, int i, int &e)
    {
        Node *p;
        p = L;    //定义一个指向第i个结点的指针p
        Node *q;  //暂时存放待删除结点
        int j = 0;
        
        //顺指针向后查找,直到p指向第i个结点
        while (p->next && j < i) {
            p = p->next;
            j++;
        }
        
        //删除位置合法性判断
        if (!p || j > i) {
            cout << "element is not exist!";
            return 0;
        }
        
        q = p->next;
        p->next = q->next;  //删除第i个结点
        e = q->data;
        free(q);
        return e;   //返回删除结点元素的值
    }
     
    #pragma mark - 显示线性表中的所有元素
    /****----------------------------------------------****/
    //函数名: DisplayList(LinkList &L)
    //参数: (传入)LinkList &L,线性表头指针L的地址
    //作用: 显示线性表中所有元素
    //返回值: 无
    /****---------------------------------------------****/
    void DisplayList(LinkList &L)
    {
        Node *p;
        p = L->next;    //定义一个指向表头结点的指针p
        while (p != NULL) {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("
    ");
    }
     
    #pragma mark - 主函数
    int main(int argc, const char * argv[]) {
        Node *L1;
        int NodeNum;
        printf("Please input the Init LinkNode Number:
    ");
        scanf("%d", &NodeNum);
        L1 = CreateOne(NodeNum);
        
        //Node *L2;
        //CreateTwo(L2, NodeNum);  //也可以这样生成L2链表
        
        //输出当前链表内容
        printf("the current L1 is:");
        DisplayList(L1);
        
        //调用
        int result;   //为了判断调用成功与否,可以定义result以备检查
        result = InsertNode(L1, 3, 88);
        if (result) {
            printf("success to insert!
    ");
        }
        
        ElementType deleteNumber;
        DeleteNode(L1, 0, deleteNumber);
        printf("被删除的元素为: %d
    ", deleteNumber);
        //输出当前链表的内容
        printf("the curent L1 is:");
        DisplayList(L1);
        return 0;
    }
    
  • 相关阅读:
    Android 查看服务service是否正在运行 列出正在运行的服务
    应用获取root权限分析及总结
    图片高斯模糊效果
    Android的启动脚本–init.rc
    前台页面——js/jq 取/设值
    Access denied for user 'bruce'@'localhost' to database 'DBbruce'
    python基础-面向对象opp
    python基础-软件目录结构规范
    python基础-装饰器
    python基础列表生成式,迭代器
  • 原文地址:https://www.cnblogs.com/itbsl/p/9835593.html
Copyright © 2011-2022 走看看