zoukankan      html  css  js  c++  java
  • 数据结构2

    一、链表是一种常见的重要的数据结构。

    它是动态地进行存储分配的一种结构。
    
    它可以根据需要开辟内存单元。
    
    链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。
    
    链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。
    
    因此,head指向第一个元素:
    第一个元素又指向第二个元素;
    ……,
    直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,
    “表尾”的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
    

    二、单向链表

    链表的各类操作包括:

     1. 创建
    
     2. 输出
    
     3. 插入(无序、有序)
    
     4. 删除
    
     5. 反序
    
     6. 排序(选择、插入、冒泡)
    
    //
    //  main.c
    //  C语言单向链表
    //
    //  Created by zhengbing on 2017/5/16.
    //  Copyright © 2017年 zhengbing. All rights reserved.
    //
    
    #include <stdio.h>
    #include <stdlib.h> // malloc 可以开辟指定大小的内存空间
    
    // 是否需要补齐,要看开辟的总空间是不是最大成员变量所占内存的倍数
    // 定义一个节点(node)的结构体
    struct Student {
        char name[20];              // 存储学生姓名
        int age;                    // 存储学生年龄
        struct Student * next;      // 指向下一个节点
    };
    
    // 创建一个新节点并返回其地址
    struct Student * newNode(){
    
        // 开辟一个大小为 32 的地址空间,并强制转换为(struct Student *)的指针
        struct Student * stu = (struct Student *)malloc(sizeof(struct Student));
    
        printf("请输入姓名:
    ");
    //    scanf("%s", &stu->name[0]); // 给姓名赋值(数组名就表示首地址)
        scanf("%s", stu->name); // 给姓名赋值(数组名就表示首地址)
    
        printf("请输入年龄:
    ");
        scanf("%d", &stu->age); // 给年龄赋值
    
        stu->next = NULL;       // 默认尾指针 = NULL
        return stu;
    }
    
    struct Student * createList(){
        struct Student * head = newNode();
        struct Student * preNode = head; // 最开始的前指针为头指针
        struct Student * node = newNode();
    
        // 当新建的节点age != 0 的时候,就串联到链表上去
        while (node->age != 0) {
            preNode->next = node;   // 1.让前节点指向新节点
            preNode = node;         // 2.让最后一个节点成为新的前节点
            node = newNode();       // 3.继续创建新节点
        }
        return head;
    }
    
    void printList(struct Student * head){
        printf("=====================
    ");
    
        struct Student * temp = head;
        while (temp != NULL) {
            printf("姓名:%s 
    ",temp->name);
            printf("年龄:%d 
    ",temp->age);
            printf("下一个节点地址:%p 
    ",temp->next);
            temp = temp->next;
        }
    }
    
    int main(int argc, const char * argv[]) {
    
        struct Student stu  = * createList();
        printList(&stu);
        return 0;
    }
    

    三、双向链表
    四、循环链表

  • 相关阅读:
    Python 字符串格式化
    centos 7 & 6 优化脚本
    centos7.X 系统初始化>>优化
    重新嫁接rm命令
    ArcGIS Engine 10 开发常见问题的解决方法
    数据提交成功后如何避免alert被window.location.reload()影响
    服务器端IIS中部署带Office组件程序
    常用正则表达式
    C#解析XML
    使用Spire.Doc组件利用模板导出Word文档
  • 原文地址:https://www.cnblogs.com/markbin/p/6765215.html
Copyright © 2011-2022 走看看