线性表&单链表

线性表
**   **线性表也叫做顺序表,是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
  它的有点是访问方便、直接,但是不足是在插入、删除时需要的内存空间因为不确定而往往比较大。


单链表
  链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。所以每个结点都是一个结构体。这里需要注意的是,在定义结构体的时候,结构体里面的变量必须是能够明确确定内存空间的。


#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();
            
            //判断这个字符是不是'\n'
            if (character == '\n'){
                //输入完毕了
                break;
            } else{
                //保存
                //判断是不是第一次来分配内存空间
                if (pTemp->name == NULL) {
                    //第一次 使用malloc
                    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;
        
        //判断是将这个结点+到head 还是tail
        if (pHead == NULL) {
            pHead = pTemp;
            pTail = pTemp;
        } else{
            pTail->next = pTemp;
            pTail = pTemp;
        }
    }
    
    Node *pTemp = pHead;
    while (pTemp != NULL) {
        printf("%s\n", pTemp->name);
        pTemp = pTemp->next;
    }
    printf("\n");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,475评论 1 3
  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,929评论 0 7
  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 2,088评论 6 15
  • 完整代码需结合前面一篇顺序表数据结构学习-线性表之顺序表各种操作网易云课堂小甲鱼课程链接:数据结构与算法 线性表的...
    NotFunGuy阅读 9,284评论 0 9
  • 厉害了,我的哥。今天打开文章之后真是有种坐着高速列车,或者看一场节奏快到不能眨眼的美剧,看完之后酣畅淋漓的刺激感。...
    潇小娴阅读 219评论 0 0