• 12月15号 单链表


    什么是链表?
    ┌───┬───┐
    │data│next │
    └───┴───┘
    data域--存放结点值的数据域
    next域--存放结点的直接后继的地址(位置)的指针域(链域)
    注意:
    ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
    ②每个结点只有一个链域的链表称为单链表(Single Linked List)。
     

    如何定义?

    typedef struct node{

        char *name;

        struct node *next;

    }Node;

    ps:在定义结构体的时候,结构体里面的变量必须是能够明确确定内存空间的。

     

     

    #include <stdio.h>

    #include <stdlib.h>

     

    typedef struct node{

        char *name;

        struct node *next;

    }Node;

     

    void myFree(Node *pHead){

        while (pHead != NULL) {

            //保存下一个结点的地址

            Node *pTemp = pHead->next;

            

            //首先释放name对应的内存空间

            free(pHead->name);

            

            //再释放结点本身

            free(pHead);

            

            //pHead指向下一个

            pHead = pTemp;

        }

    }

     

    int main(int argc, const char * argv[]) {

        

        Node *pHead = NULL;

        Node *pTail = NULL;

        

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

            int total = 0;

            //创建一个新的结点

            Node *pTemp = (Node *)malloc(1 * sizeof(Node));

            if (pTemp == NULL) {

                //分配失败

                myFree(pHead);

                exit(EXIT_FAILURE);

            }

            

            //提示用户输入

            //name分配内存空间

            printf("请输入姓名:");

            char character;

            while (1) {

                //获取一个字符

                character = getchar();

                

                //判断是不是回车键

                if (character == ' ') {

                    break;

                }else{

                    //保存

                    //是不是第一次分配内存

                    if (pTemp->name == NULL) {

                        //第一次

                        pTemp->name = (char *)malloc(1 * sizeof(char));

                        if (pTemp->name == NULL) {

                            exit(EXIT_FAILURE);

                        }

                    }else{

                        pTemp->name = (char *)realloc(pTemp->name, (total+1)*sizeof(char));

                        if (pTemp->name == NULL) {

                            exit(EXIT_FAILURE);

                        }

                    }

                    

                    pTemp->name[total] = character;

                    total ++;

                }

            }

            

            //为这个结点的next指针赋初值

            pTemp->next = NULL;

            

            //判断加载头结点还是尾结点

            if (pHead == NULL) {

                //头结点

                pHead = pTemp;

                pTail = pTemp;

            }else{

                //不是头结点

                pTail->next = pTemp;

                pTail = pTemp;

            }

        }

        

        //输出结果

        Node *pTemp = pHead;

        while (pTemp != NULL) {

            printf("%s ",pTemp->name);

            pTemp = pTemp->next;

        }

        printf(" ");

        

        return 0;

    }

  • 相关阅读:
    干货!常见的SQL面试题:经典50例!
    图解SQL基础知识,小白也能看懂的SQL文章!
    30多个Java实战项目,全部在这里了。
    Spring的@PropertySource注解使用
    20201226[java]两数相加
    1013.表-约束-唯一、主键、外键和排他
    1012.表-约束-检查
    1011.表-生成列
    1010.表默认值
    1009.表基础-初识表
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/5049075.html
Copyright © 2020-2023  润新知