数据结构第二章—— 静态链表
get 到的东西:
在很多时候需要根据此时的输入来控制上一个位置的参数
在输入的时候,读到-1结束,此时要让上一个数组的cur指向0,可以
- 多用一个temp存着上一个数组的下标,然后
head[temp].cur = 0;
- 先判断这个数有没有结束,再让data_cur进入下一个数组位置
head[data_cur].cur
实现流程
- 定义节点,包括数据和游标(下一个数据所在的数组位置)
typedef struct static_node{
int data;
int cur;
}Static_node;
- 用这种结构类型构建一个数组,并初始化
Static_node head[Size];
head[0].cur = Real_Size;
head[Real_Size-1] = 0;
- 先设置空表,最后一个元素的cur指向0
for ( i =0; i<Size-1; i++)
{
head[i].cur = i+1;
head[Size-1].cur = 0;
}
- 在数据插入时,会怎样呢?
静态列表有几个特点:- 数组的第一位【0】 用来存放备用列表的首位,一般是数据最后一位的下一个位置
- 数据的最后一位的cur指向数组首位【0】
- 组空间的最后一位…感觉指啥都行啊,那就让它指着数组头吧,然后当数据的cur为0的时候报数据满了
-
增加和删除
增加删除都一样,读入一下数据,把几个参数改一下,把可能出现的状况都想一下,然后把逻辑理一下就好了。不过感觉先写一下伪代码会舒服点,不然会漏东西。
就是写逻辑+写变化的参数 -
转移函数
数组的话就是传数组的名,接收端接受数组名的指针,数组照用
常数要改的话就穿地址,接收端收常数指针,再重新定义一遍常数等于指针的值,中间一样,在最后再把常数的值赋予到指针上,传回主函数
结构体也一样,可看做int,float的另一种形式
把常数传进函数的时候记得重新创个常数,把指针的值赋到常数上
C语言代码——实现部分操作
// 2020/2/12 在这里的haead,data_number和cur没有写到一个列表里,
// 造成了多次引用,不方便,之后就全写一起了
#include <stdio.h>
#include <stdlib.h>
#define Size 100
#define Real_Size 7;
typedef struct static_node{
int data;
int cur;
}Static_node;
void init_head( Static_node *head );
void add( Static_node *head, int *pdata_number);
void print(Static_node *head, int data_number, int first_cur );
void Insert( Static_node *head, int *pdata_number, int *pfirst_cur);
void Delete( Static_node *head, int *pdata_number, int *pfirst_cur);
int main()
{
int data_number = 0, first_cur = 1;
Static_node head[Size] ;
init_head(head);
add( head, &data_number );
print( head, data_number, first_cur );
Insert( head, &data_number, &first_cur);
print( head, data_number, first_cur );
Delete( head, &data_number, &first_cur);
print( head, data_number, first_cur );
return 0;
}
void init_head( Static_node *head )
{
int i;
for ( i =0; i<Size-1; i++)
{
head[i].cur = i+1;
head[Size-1].cur = 0;
}
}
void add(Static_node *head,int *pdata_number)
{
int number, data_cur = 1, data_number = 0, temp = 0;
do {
scanf("%d", &number);
if( number != -1){
temp = data_cur;
head[data_cur].data = number;
data_cur = head[data_cur].cur;
data_number++;
}
else {
head[temp].cur = 0;
}
}while(number != -1);
head[0].cur = data_number + 1;
*pdata_number = data_number;
}
void print(Static_node *head, int data_number, int first_cur )
{
// 输出一遍静态链表,需要 data_number, head数组
int data_cur = first_cur;
printf("数据共有%d个\t", data_number);
while ( data_number != 0 ){
printf("%d\t", head[data_cur].data);
if( head[data_cur].cur == 0) break;
data_cur = head[data_cur].cur;
}
}
void Insert( Static_node *head, int *pdata_number, int *pfirst_cur)
{
// 再写一个插入链表的
int insert_number = 0, insert_location = 0, i ;
int data_number = *pdata_number;
int first_cur = *pfirst_cur;
int data_cur = first_cur;
int before_cur = 0;
printf("输入插入数据的位置和大小,格式为:4 12\n");
scanf("%d %d", &insert_location, &insert_number);
for( i = 1; ; i++ ) {
if( insert_location==i ){
if(insert_location == 1) { first_cur = data_number + 1; }
if( before_cur ) { head[before_cur].cur = data_number + 1; }
head[data_number + 1].cur = data_cur ;
head[data_number + 1].data = insert_number ;
data_number ++;
break;
}
before_cur = data_cur;
data_cur = head[data_cur].cur;
}
*pdata_number = data_cur;
*pfirst_cur = first_cur;
printf("增加完毕\n");
}
void Delete( Static_node *head, int *pdata_number, int *pfirst_cur)
{
//写一个删除的
int data_number = *pdata_number;
int first_cur = *pfirst_cur;
int delete_location = 0, i, before_cur ;
int data_cur = first_cur;
before_cur = 0;
printf("输入删除数据的位置,格式为:4\n");
scanf("%d", &delete_location);
for( i = 1; ; i++ ) {
if( delete_location == i ){
if(delete_location == 1) { first_cur = head[data_cur].cur ; }
if( before_cur ) { head[before_cur].cur = head[data_cur].cur; }
data_number --;
break;
}
before_cur = data_cur;
data_cur = head[data_cur].cur;
}
*pdata_number = data_cur;
*pfirst_cur = first_cur;
printf("删除完毕");
}