目录
一、数据结构的介绍
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;
}