Anekys 发表于 2020-2-22 17:39

C语言实现单向动态链表

本帖最后由 Anekys 于 2020-2-22 17:40 编辑

准备NCRE二级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程序给老师讲解,让老师直接判定是否合格.
所以开贴分享,顺便做个记录.{:301_978:}

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

Anekys 发表于 2020-2-23 12:57
控制台程序?

是的,要叫我们做其他我们也不会啊{:1_907:}

wws741 发表于 2020-2-25 16:04

大佬,有什么资料好学数据结构跟算法?C语言的

Anekys 发表于 2020-2-25 16:31

北漂小狼 发表于 2020-2-25 14:02
是的,要叫我们做其他我们也不会啊

{:301_1008:}好吧,感觉功能不复杂的话,应该挺好实现的吧
页: [1] 2
查看完整版本: C语言实现单向动态链表