吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2001|回复: 12
收起左侧

[C&C++ 转载] C语言实现单向动态链表

[复制链接]
Anekys 发表于 2020-2-22 17:39
本帖最后由 Anekys 于 2020-2-22 17:40 编辑

准备NCRE二级C语言,学到动态链表这里心血来潮,自己仿写了一个.代码如下
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node                                                                        //定义一个可作为数链表结点的结构体,分为数据部分,和地址部分.
{
        int data;                                                                                //数据部分存储数据
        struct Node * pnext;                                                        //地址部分存储下一结点的地址
}N,*P;                                                                                                //为这种结点起名为N,其自身的内存地址取名为P
P create(void)                                                                                //创建一个动态链表的头结点
{
        P phead=(P)malloc(sizeof(N));                                        //申请一块儿内存空间
        if(phead == NULL)                                                                //判断是否申请失败
        {
                printf("分配内存失败!\n");
                return NULL;
        }
        phead->pnext = NULL;                                                //将地址部分置空(因为这里只创建了一个结点而尾结点的地址部分是要为NULL的)
        return phead;                                                                //返回头结点的内存地址
}
void input (P phead,int value)                                        //在链表最后加上一个结点
{
        P last = (P)malloc(sizeof(N));                                //申请一块儿内存空间并把这块内存空间的地址放到last中存放
        if(last==NULL)                                                                //判断内存是否申请失败
        {
                printf("分配内存失败");
                exit(-1);
        }
        last->data = value;                                                        //将要加入的数据放到数据部分
        last->pnext =NULL;                                                        //将地址部分置空
        while(phead->pnext  != NULL)                                //找寻添加结点前的最后一个结点
        {
                        phead=phead->pnext;
        }
                
        phead->pnext =last;                                                        //将新创建的结点与原有链表拼合
        
}
int len(P phead)                                                                        //取链表含有有效数据的结点的个数
{
        for(int i=0;phead->pnext != NULL;++i)                        //遍历整个链表的有效结点
                phead=phead->pnext ;
        return i;
}
void show(P phead)                                                                        //把整个链表中结点存放的数据输出
{
        while(phead->pnext  != NULL)                                        //遍历整个链表的有效结点并输出数据部分
        {
                phead=phead->pnext ;
                printf("%d\n",phead->data );
        }

}
bool del(P phead,int index)                                                                //删除第index个结点
{
        if(index < 0 || phead->pnext  == NULL || index >len(phead))                        //判断链表是否只有一个头结点或者index的位置不存在
                return false;
        for(int i=1;i<index;++i)                                                                //找到第index结点的前一个结点
                phead=phead->pnext;
        P p0=phead->pnext ;                                                                                //将第index的结点位置保存下来
        phead->pnext =p0->pnext ;                                                                //将index的后一个结点与其前一个结点拼合
        free(p0);                                                                                                //释放原index结点的内存空间
        return true;        
}
bool insert(P phead,int index,int value)                                                //在第index结点的前面插入一个结点
{
        if(index < 0 || phead->pnext  == NULL )                                                //判断链表是否只有一个头结点或者index的位置不存在
                return false;
        if(index>len(phead))                                                                                //如果index大于链表的有效节点数则直接在链表的最末尾添加
        {
                input(phead,value);
                return true;
        }
        for(int i=1;i<index;++i)                                                                        //找到index结点的前一个结点
                phead=phead->pnext;
        P p0=(P)malloc(sizeof(N));                                                                        //创建要插入的新结点
        p0->data =value;                                                                                        //将数据存入新节点的数据部分
        p0->pnext =phead->pnext ;                                //将新节点的地址部分指向被插入的结点
        phead->pnext=p0;                                                //将被插入结点的前一个结点的地址部分指向新插入的结点
        return true;
}
void invert(P phead)                                        //将链表倒置(逆序排放)
{
        if(phead == NULL || phead->pnext == NULL)        //判断是否只有一个头结点或头结点是否存在
                return;
        P p0=phead->pnext;                                                        //这里定义了三个p类型的结构体,用来存放链表中的数据
        P p1=p0->pnext;                                                                
        P p_0=p0,p2;                                                                //整体的思路为:
        while(p1 != NULL)                                                //先按顺序找都头结点后的三个结点
        {                                                                                //将第二个结点的地址部分指向前一个结点
                p2=p1->pnext;                                                //然后这三个结点的位置一起向后移动一个位置
                p1->pnext=p0;                                                //通过循环结构遍历整个链表并完成上述操作
                p0=p1;
                p1=p2;
        }
        p_0->pnext=NULL;                                                //将倒置后的最后一个结点(尾结点)的地址部分置空(NULL)
        phead->pnext=p0;                                                //将头结点的地址部分指向倒置后的第一个有效结点(也就是倒置前的最后一个结点)
}
void main()
{
        P head=create();
        //printf("%d\n",head);
        input(head,1);
        input(head,2);
        input(head,3);
        input(head,4);
//        del(head,3);
//        insert(head,4,5);
//        invert(head);
        show(head); 

//        printf("%d\n",len(head));
}


编写环境为VC6.0,因为我们学校的C语言课的期末考可以通过自己写一个C程序给老师讲解,让老师直接判定是否合格.
所以开贴分享,顺便做个记录.

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Anekys 发表于 2020-2-25 16:32
wws741 发表于 2020-2-25 16:04
大佬,有什么资料好学数据结构跟算法?C语言的

数据结构我也没学过....C语言的话大多数人不都是看谭浩强老师的那本C程序设计嘛
北漂小狼 发表于 2020-2-26 00:05
Anekys 发表于 2020-2-25 16:31
好吧,感觉功能不复杂的话,应该挺好实现的吧

就一个单向链表的问题,查找插入,删除
cjcj5243 发表于 2020-2-22 17:55
裴冰夏 发表于 2020-2-22 18:21
加油 给你点赞
zhanghailiangji 发表于 2020-2-23 11:15

加油 给你点赞
北漂小狼 发表于 2020-2-23 12:21
我们要做个简单的图书管理系统
 楼主| Anekys 发表于 2020-2-23 12:57
北漂小狼 发表于 2020-2-23 12:21
我们要做个简单的图书管理系统

控制台程序?
北漂小狼 发表于 2020-2-25 14:02

是的,要叫我们做其他我们也不会啊
wws741 发表于 2020-2-25 16:04
大佬,有什么资料好学数据结构跟算法?C语言的
 楼主| Anekys 发表于 2020-2-25 16:31
北漂小狼 发表于 2020-2-25 14:02
是的,要叫我们做其他我们也不会啊

好吧,感觉功能不复杂的话,应该挺好实现的吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-9 00:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表