静态链表初尝试

静态链表的设计思想:

 下面看具体实现代码:

首先看头文件:staticlist.h

#ifndef _STATICLIST_H_
#define _STATICLIST_H_
#define MAX_SIZE 10


//数据节点
typedef struct _static_list_node{
	int data;
	int next;
}static_list_node;

//头节点
typedef struct _t_static_list{
	int capacity;
	static_list_node header;
	static_list_node node[];
}t_static_list;

t_static_list *create_list();
void clear(t_static_list *t_list);
void destroy(t_static_list *t_list);
int get_len(t_static_list *t_list);
int insert_value(t_static_list *t_list,int value,int pos);
static_list_node get_value(t_static_list *t_list,int pos);
static_list_node delete_value(t_static_list *t_list,int pos);

#endif

然后看实现文件:staticlist.c

#include <stdio.h>
#include <stdlib.h>
#include "staticlist.h"


t_static_list *create_list()
{
	t_static_list *t_list = (t_static_list*)malloc(sizeof(t_static_list) + sizeof(static_list_node) * MAX_SIZE);
	if(t_list != NULL) {
		t_list->capacity = MAX_SIZE;
		t_list->header.data = 0;
		t_list->header.next = 0;
		t_list->node[0] = t_list->header;
		//初始化数组空间下标
		int i = 1;
		for(;i < MAX_SIZE;i++) {
			t_list->node[i].next = -1;
		}	
	}
	return t_list;
}

void clear(t_static_list *t_list) {
	if(t_list != NULL) {
		t_list->header.data = 0;
		t_list->node[0] = t_list->header;//直接赋值	
	}
}

void destroy(t_static_list *t_list) {
	if(t_list != NULL) {
		//直接释放头部空间,因为只有头部空间分配了内存
		free(t_list);
	}	
}

int get_len(t_static_list *t_list)
{
	int res = -1;
	if(t_list != NULL) {
		res = t_list->header.data;
	}
	return res;
}

int insert_value(t_static_list *t_list,int value,int pos)
{
	//不用分配空间,空间已经分配
	int res = t_list != NULL && pos >= 0 && pos <= get_len(t_list);
	res = res && get_len(t_list) + 1 <= MAX_SIZE;
	if(res) {
		//判断一下空闲的位置
		int j = 1;
		//0这个位置已经被头结点给占用,从1开始
		int index = 1;
		//从头开始循环,只要有位置,直接放值
		for(;j <= MAX_SIZE - 1;j++) {
			//==-1说明位置空闲,直接跳出循环,不找了
			if(t_list->node[j].next == -1){				
				index = j;
				break; 
			}
		}
		int i = 0;
		int cur_index = 0;
		//在具体某个位置放值
		//printf("index=%d\n",index);
		t_list->node[index].data = value;
		printf("插入时pos的变化-->%d\n",pos);
		for(;i < pos;i++) {
			cur_index = t_list->node[cur_index].next;
			printf("插入时cur_index的变化----->%d\n",cur_index);
		}
		int next_index = t_list->node[cur_index].next;//当前指针的next
		t_list->node[index].next = next_index;
		t_list->node[cur_index].next = index;
		t_list->node[0].data++;
		t_list->header = t_list->node[0];//同一种类型的结构体赋值
	}
	return res;
}

static_list_node get_value(t_static_list *t_list,int pos)
{
	static_list_node res;
	//printf("线性表的数据长度:%d\n",t_list->header.data);
	if(t_list != NULL && pos >= 0 && pos < get_len(t_list)) {
		int i = 0;
		int cur_index = 0;
		for(;i < pos;i++) {
			printf("进来开始循环了\n");
			cur_index = t_list->node[cur_index].next;
			printf("cur_index的变化=%d\n",cur_index);
		}
		printf("当前索引cur_index=%d\n",cur_index);
		int obj_index = t_list->node[cur_index].next;
		res = t_list->node[obj_index];
		printf("obj_index=%d;res=%d\n",obj_index,res.data);
	}
	//啥都没做,返回值为空
	return res;
}

static_list_node delete_value(t_static_list *t_list,int pos)
{
	static_list_node res = get_value(t_list,pos);
	if(t_list != NULL && pos >= 0 && pos < get_len(t_list)) {
		int i = 0;
		int cur_index = 0;
		for(;i < pos;i++) {
			cur_index = t_list->node[cur_index].next;
		}
		//找到上一个节点
		int del_next = t_list->node[cur_index].next;
		t_list->node[cur_index].next = t_list->node[del_next].next;
		//修改next下标
		t_list->node[del_next].next = -1;
		t_list->node[0].data--;
		t_list->header = t_list->node[0];
	}
	return res;
}

void print_list(t_static_list *t_list) 
{
	if(t_list != NULL) {
		int i = 0;
		static_list_node res;
		for(;i < get_len(t_list);i++) {
			res = get_value(t_list,i);
			printf("%d %d %d\n",i + 1,res.data,res.next);//下一个角标
		}
	}	
}

说一下上面的.c文件,里面我保留了自己测试代码的一些代码行,没有删除

实现文件:main.c

int main() {
	//创建
	t_static_list *t_list = create_list();

	printf("插入之前的长度->%d\n",get_len(t_list));

	//插入数据
	insert_value(t_list,87,get_len(t_list));
		
	insert_value(t_list,88,get_len(t_list));
	
	insert_value(t_list,89,get_len(t_list));

	printf("插入之后的长度->%d\n",get_len(t_list));
	
	delete_value(t_list,0);

	printf("删除之后的长度->%d\n",get_len(t_list));

	printf("\n-----------------------\n");

	print_list(t_list);


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值