数据结构
结构体
struct info
{
char name[32];
int heigh;
int qq;
int number;
}
struct info lisi;//定义了struct info类型的lisi
struct info *lisi;//定义了struct info类型指针变量的lisi ,要对其进行malloc内存
typedef struct info *p_info;定义了struct info类型指针变量的p_info
p_info lisi; == struct info *lisi;
1、用typedef方式对结构进行定义,然后对结构体成员进行赋值,并打印出来
struct info
{
char name[32];
int heigh;
int qq;
int number;
}
数据之间的关系
集合 线性 树状 图状
顺序 链式 索引 散列
顺序存储
数据存放的地址是紧挨着的
需要预定空间大小,会造成空间的浪费或者不够用
查找数据方便,插入数据,删除数据不方便
链式存储
数据存放的地址是分散的,不一定紧挨着,随系统分配
增删查改
增加数据
删除数据
查找
修改
数据:存放信息
数据元素:记录(名字,性别,身高 QQ)
单向链表 单向循环链表 双向链表 双向循环链表 内核链表(双向链表)
1、节点
typedef struct node{
int data;
//char name[20];
struct node *next;
}node_list,*single_list; //node_list = struct node single_list = struct node *
2、节点初始化
single_list init_list(void) //==struct node *init_list(void){
single_list my_list = malloc(sizeof(node_list));//为节点开辟堆空间
if(my_list == NULL) //判断是否分配空间成功
return ;
my_list->next = NULL; //置节点的next指针为空,防止为野指针
return my_list; //返回成功的指针地址
}
3、插入节点
void insert_node(single_list p,single_list new)
{if(p == NULL || new == NULL) //判断传过来的p与new是否为NULL
return;
new->next = p->next; //new里的指针指向p本来指向的下一个节点
p->next = new; //p里面的指针指向new节点
}
4、显示节点信息
void show(single_list list){
if(list == NULL)
return;
single_list p = list->next;
while(p!=NULL)
{
printf("data = %d\n",p->data);
p = p->next;
}
printf("\n");
}
5、查找节点
single_list find_node(single_list head_list,int data)
{
if(head->next == NULL)
return;
single_list p;
p = head->next; //指向第一个节点
while(p!=NULL)
{
if(p->data == data) //判断是否为删除的数据
break;
p=p->next;
}
return p;
}
6.删除节点
int remove_node(single_list head_list,single_list delete_list){
if(head_list->next == NULL)
return;
single_list p = head_list;
while(p!=NULL && (p->next != delete_list))
{
p=p->next;
}
if(p == NULL)
return 0;
p->next = delete_list->next;
delete_list = NULL;
}
练习:插入节点,并显示出来
93 65 78 45
删除节点:
1、找到节点
2、删除节点
3、free节点
练习:
基础操作
1、实现节点移动操作(比如输入4 5,结果把4移到5后面)
1 2 58 69 45 21
输入:1 45
输出:2 58 69 45 1 21
加强操作
2、在一个结构体中定义学生的成员变量(学号,姓名,身高)
手动输入5个学生的信息,用链表关联起来,当输入i时,按学号从低到高排序并打印出来