C语言学习:链表的概念和其简单操作

(一)什么是链表?

链表是一种常见的基础数据结构,是一种线性表,是一种在物理存储单元上非连续非顺序的存储结构。
链表有一系列节点构成,节点在运行时动态生成,每个节点包括数据域,数据域存储当前节点的信息,指针域存储下一个节点的手地址。

(二)为什么要使用链表?

  1. 顺序存储对空间的利用率不高;
  2. 内存随着时间的增加会找不到大块的顺序空间;
  3. 数组的大小只能是固定的,增加或删除都会移动大量数据;
  4. 链式存储大小可以伸缩;
  5. 链式存储利用率高。

(三)单向链表和双向链表

单向链表:每个元素包含一个指针域,该指针域指向该元素的直接后继元素。
双向链表:每个元素除了有一个指针域指向直接后继元素以外,还有一个指针指向其直接前驱元素。
如果把最后一个节点的指针指向第一个结点,同时把第一个结点的前向指针指向最后一个结点,这样就构成单向循环链表和双向循环链表。

(四)一个简单案例

这是一个小的系统,能实现几项简单的功能:创建链表、输入数据、查看信息、保存信息、读取信息、 删除结点、 查找信息
以下为部分代码:

结构体定义

typedef struct date
{
    char name[32];
    char pass[32];
    char id[32];
}DATE;

typedef struct head
{
    int len;
    struct node * pfhead;
}Head,*PH;

typedef struct node
{
    DATE date;
    struct node * next;
}NODE,*PN;

创建链表
功能:构造一个链表头
传参:空
返回值:链表头
调用函数:无

PH create_list()
{
    PH phead=NULL;
    phead = (PH)malloc(sizeof(Head));
    phead->pfhead=NULL;
    phead->len=0;
    return phead;
}

获取数据
功能:获取数据
传参:空
返回值:链表头
调用函数:无

PN getdate()
{
    PN pnode=NULL;
    pnode = (PN)malloc(sizeof(NODE));
    printf("请输入以下信息:\n");
    printf("name:");
    scanf("%s",pnode->date.name);
    getchar();
    printf("pass:");
    scanf("%s",pnode->date.pass);
    getchar();
    printf("id:");
    scanf("%s",pnode->date.id);
    getchar();
    return pnode;
}

插入结点
功能:插入结点到链表中
传参:链表头
返回值:链表头
调用函数:获取数据函数 getdate()

PH insert_list(PH phead)
{
    NODE* node;
    int flag=0,i=0;
    while(1)
    {
        if(flag!=0)
        {
            printf("是否继续添加:1继续,0结束\n");
            printf("你的选择:");
            scanf("%d",&i);
            getchar();
            if(i == 0)
                break;
        }
        node = getdate();
        node->next=phead->pfhead;
        phead->pfhead=node;
        phead->len++;
        flag++;
    }
    return phead;
}

打印链表
功能:打印链表信息
传参:链表头
返回值:空
调用函数:无

void print_list(PH phead)
{
    PN node=phead->pfhead;
    while(node!=NULL)
    {
        printf("%-8s%-8s%-8s\n",node->date.name,node->date.pass,node->date.id);
        node=node->next;
    }
    printf("任意键退出:");
    getchar();
}

查找数据
功能:查找数据成员
传参:链表头
返回值:无
调用函数:无

void search_list(PH phead)
{
    PN node=phead->pfhead;
    char id[32];
    printf("请输入ID:");
    scanf("%s",id);
    getchar();
    while(node->next!=NULL && strcmp(node->date.id,id)!=0)
    {
        node = node->next;
    }
    if(strcmp(node->date.id,id)==0)
    {
        printf("%-8s%-8s%-8s\n",node->date.name,node->date.pass,node->date.id); 
    }
    else
    {
        printf("查无此人\n");
    }
    printf("任意键退出:");
    getchar();
    return ;
}

删除结点
功能:删除结点
传参:链表头
返回值:链表头
调用函数:无

PH delete_list(PH phead)
{
    PN node=phead->pfhead;
    PN node2;
    char id[32];
    printf("请输入ID:");
    scanf("%s",id);
    getchar();
    while(node->next!=NULL && strcmp(node->date.id,id)!=0)
    {
        node2=node;
        node = node->next;
    }
    if(strcmp(node->date.id,id)==0)
    {
        if(node == phead->pfhead)
            phead->pfhead=node->next;
        else
            node2->next=node->next;
        phead->len--;
    }
    else
    {
        printf("查无此人\n");
    }
    return phead;
}

保存信息
功能:保存信息到文件
传参:链表头
返回值:无
调用函数:无

void save_list(PH phead)
{
    FILE * fp;
    if((fp=fopen("phead","w"))==NULL)
        {
            printf("打开文件失败\n");
            exit(1);
        }
    PN node=phead->pfhead;
    while(node!=NULL)
    {
        fwrite(node,sizeof(NODE),1,fp);
        node=node->next;
    }
    fclose(fp);
    return ;
}

读取信息
功能:从文件中读取信息
传参:空
返回值:链表头
调用函数:无

PH read_list()
{
    FILE * fp;
    if( (fp=fopen("phead","r"))==NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
    PH phead=(PH)malloc(sizeof(Head));
    phead->pfhead=NULL;
    PN node=(PN)malloc(sizeof(NODE));
    while(fread(node,sizeof(NODE),1,fp)>0)
    {
        node->next=phead->pfhead;
        phead->pfhead=node;
        phead->len++;
        node=(PN)malloc(sizeof(NODE));
    }
    fclose(fp);
    return phead;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,513评论 1 51
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,438评论 1 3
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,202评论 0 25
  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 7,648评论 0 10
  • 梦的哲思 你觉得梦是什么? 是困的妥协物质, 还是精神的主宰? 梦是柔软的, 是人类的第二个世界, 同现实的世界是...
    片刻灵光mieco阅读 163评论 0 2