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;

}

原文地址:https://www.cnblogs.com/hmzxwky/p/5049075.html