从零开始一起学C语言(九)---数据结构

目录

一、数据结构的介绍

1、数据结构

2、数据结构的存储方式

二、内存的动态开辟和释放

1、内存的动态开辟

2、内存的动态释放

三、链表的创建

1、链表头的创建

四、链表的读和写

1、创建任意数量的节点

2、链表的写

3、链表的读

五、链表的插入

1、头插法

2、尾插法

六、链表的删除


一、数据结构的介绍

1、数据结构

相互之间具有一定联系的数据元素的集合。数据元素之间的关系称为逻辑结构。常见的四种基本逻辑结构:

1)集合:数据元素除了同属于一个集合外,没有其他关系。

2)线性结构:数据元素之间存在一对一的关系。电话簿

3)树形结构:数据元素之间存在一对多的关系。磁盘的文件系统

4)网状结构:数据元素之间存在多对多的关系。交通网络

2、数据结构的存储方式

根据数据元素之间的关系可以分为顺序存储结构和链式存储结构。

顺序存储结构:用元素之间的相对位置来表示数据元素之间的关系。存储地址是连续的。

链式存储结构:数据元素内存储另外一个数据元素的地址。用该地址表示数据元素之间的关系。存储地址是不连续的。

二、内存的动态开辟和释放

1、内存的动态开辟

函数原型:void * malloc(size_t size);

函数作用:分配size个字节的内存空间,并返回所分配内存的指针。

函数形参:size_t为自定义类型,unsigned int;

size为所需要分配的内存空间的大小。

函数返回值:分配成功返回所分配的内存空间的首地址,

不成功返回NULL。

2、内存的动态释放

函数原型:void free(void *block);

函数作用:释放程序动态申请的内存空间,

以便能提高程序对内存的利用率。

函数参数:block为所需要释放的内存空间的首地址。

三、链表的创建

习惯称链表的数据元素为节点。一个节点存放下一个节点的地址。

每个节点分为数据域,指针域。

1、链表头的创建

#include <stdio.h>

#include <stdlib.h>

int create_link_head();

struct tag

{

         int num;

         char name[20];

};



struct link

{

         struct tag std;

         struct link *pnext;

};

struct link *phead;//头指针

struct link *pnew; //指向新开辟内存的首地址

struct link *ptemp;//临时指针

int main()

{

         create_link_head();

         return 0;

}

int create_link_head()

{

         phead = (struct link *)malloc(sizeof(struct link));

         if(phead == NULL)

         {

                   printf("建立链表头失败\n");

                   return -1;

         }

         printf("创建链表头成功\n");

         phead->pnext = NULL;

         return 0;

}

四、链表的读和写

1、创建任意数量的节点

int create_link_node(int n)

{

         int i;

         ptemp = phead;

         for(i=0;i<n;i++)

         {

                   pnew = (struct link *)malloc(sizeof(struct link));

                   pnew->pnext = NULL;

                   ptemp->pnext = pnew;

                   ptemp = ptemp->pnext;//ptemp = pnew

         }

         printf("创建了%d个节点\n",n);

         return 0;

}

 

2、链表的写

int write_link_data()

{

         ptemp = phead->pnext;

         while(ptemp != NULL)

         {

                   printf("请输入数字\n");

                   scanf("%d",&ptemp->std.num);

                   ptemp = ptemp->pnext;

         }

         return 0;

}

3、链表的读

int read_link_data()

{

         ptemp = phead->pnext;

         while(ptemp != NULL)

         {

                   printf("%d\n",ptemp->std.num);

                   ptemp = ptemp->pnext;

         }

         return 0;

}

五、链表的插入

1、头插法

int add1_link()//头插

{

         pnew = (struct link *)malloc(sizeof(struct link));

         printf("请输入插入数字\n");

         scanf("%d",&pnew->std.num);

         pnew->pnext = phead->pnext;

         phead->pnext = pnew;

         return 0;

}

Zhong cha fa!!!!!!

2、尾插法

int add2_link()//尾插法

{

         pnew = (struct link *)malloc(sizeof(struct link));

         printf("请输入插入数字\n");

         scanf("%d",&pnew->std.num);

         pnew->pnext = NULL;

         ptemp = phead->pnext;

         while(ptemp->pnext != NULL)//遍历

         {

                   ptemp = ptemp->pnext;

         }

         ptemp->pnext = pnew;

         return 0;

}

 

六、链表的删除

int dele_link()

{

         int num;

         struct link *pdele;

         printf("请输入需要删除的数字\n");

         scanf("%d",&num);

         ptemp = phead;

         while( ptemp->pnext !=NULL)

         {

                   if(ptemp->pnext->std.num == num)

                   {

                            pdele = ptemp->pnext;

                            ptemp->pnext = ptemp->pnext->pnext;

                            free(pdele);

                            printf("删除成功\n");

                            return 0;

                   }

                   ptemp = ptemp->pnext;

         }

         printf("输入有误\n");

         return -1;

}
上一篇:poj1015 Jury Compromise


下一篇:程序员的修炼-从优秀到卓越札记:编程之道2