数据结构代码总结

由于在学习中出现了理解的了,但自己写代码的时候却写不下去的情况,所以我决定将之前的数据结构的代码进行备注,备注有偏差的话敬请指正。

顺序表

顺序表sqlist.h文件

/*
typedef int data_t;//重命名int为data_t;
#define N 128//定义一个宏 N=128

struct sqlist_t { 
​	data_t data[N];
​	int last;
};
//定义了一个结构体sqlist_t
//其中有两个成员data数据,last变量
typedef struct sqlist_t sqlist;//sqlist L; struct sqlist_t L;
//将结构体struct sqlist_t重命名为sqlist
typedef struct sqlist_t * sqlink;// struct sqlist_t * p; sqlink p;
//将struct sqlist_t的指针重命名为*sqlink
*/

typedef int data_t;//重命名int为data_t;
#define N 128 //定义一个宏 N=128

typedef struct {
​	data_t data[N];
​	int last;
}sqlist, *sqlink;
//定义了一个结构体sqlist_t
//其中有两个成员data数据,last变量
sqlink list_create();//定义了一个创建顺序表的函数,返回值为一个指针
int list_clear(sqlink L);//定义了一个清除顺序表的函数,返回一个int值
int list_delete(sqlink L);//定义了一个删除顺序表的函数,返回一个int值
int list_empty(sqlink L);//定义了一个判断顺序表是否为空
int list_length(sqlink L);//定义了一个计算顺序表长度的函数
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int pos);//定义了一个在POS位置插入一个value值的函数
int list_show(sqlink L);//定义了一个输出顺序表的函数

顺序表sqlist.c文件

#include <stdio.h>//C语言标准输入输出函数头文件
#include <stdlib.h>//包含malloc函数的头文件
#include <string.h>//包含memset函数的头文件
#include "sqlist.h"//调用sqlist.h头文件

//顺序表的创建及初始化函数
sqlink list_create() {
​	sqlink L;
//定义了一个结构体指针L
L =(sqlink)malloc(sizeof(sqlist));
//分配一个sqlist结构体的空间,并强制转换为结构体指针类型赋予L
if (L == NULL) {
	printf("list malloc failed\n");
	return L;
}
//判断如果L为空,输出提醒,分配空间失败
//返回L
memset(L, 0, sizeof(sqlist));
//填充,充指针L开始,填充sqlist空间的0
L->last = -1;
//初始化数组的下标为-1
return L;
//返回L指针
}

//清理顺序表函数
  int list_clear(sqlink L) {
  if (L == NULL)
  ​	return -1;
//如果L为NULL,说明分配失败,返回-1
  memset(L, 0, sizeof(sqlist));
//将顺序表从指针L填充sqlist空间的0
  L->last = -1;
//将last置-1;
  return 0;
  }

//顺序表删除函数
int list_delete(sqlink L){
​	if (L == NULL) 
​		return -1;
​//如果L指针为空,返回-1
	free(L);
//释放指向顺序表的L指针的空间
​	L = NULL;
//将L置空,避免野指针
​	return 0;
//返回0
}

//判空函数
  int list_empty(sqlink L) {
  if (L->last == -1) 
  ​	return 1;
//如果last为-1,表示顺序表为空,返回1。
  else 
  ​	return 0;
//否则表示顺序表不为空,返回0
  }

int list_length(sqlink L) {
​	if (L == NULL) 
​		return -1;
//如果L为空,返回-1
​	return (L->last+1);
//返回last+1,表示顺序表长度
}

int list_locate(sqlink L, data_t value) {

return 0;

}

//在pos位置插入value函数
int list_insert(sqlink L, data_t value, int pos) {
​	int i;

if (L->last == N-1) {
	printf("list is full\n");
	return -1;
}
//如果顺序表所占的堆满,返回-1

if (pos < 0 || pos > L->last+1) {
	printf("Pos is invalid\n");
	return -1;
}
//如果位置<0或>堆空间,输出位置不合理
//返回-1
for (i = L->last; i >= pos; i--) {
	L->data[i+1] = L->data[i];
}
//将pos位置后的元素依次后移
L->data[pos] = value;
//将value值赋予pos位置
L->last++;
//last+1,
return 0;
//返回0

}

//输出顺序表函数
int list_show(sqlink L) {
​	int i;

if (L == NULL) 
	return -1;
//如果L为空,返回-1
if (L->last == -1)
	printf("list is empty\n");
//如果last为-1,输出顺序表为空
for (i = 0; i <= L->last; i++) {
	printf("%d ", L->data[i]);
}
//将顺序表中的元素依次输出
puts("");
//换行
return 0;

}

顺序表test.c文件

#include <stdio.h>
//C语言标准输入输出函数头文件
#include "sqlist.h"
//调用sqlist.h头文件

void test_insert();
//声明一个函数,返回值void

int main(int argc, const char *argv[])
{
​	test_insert();

return 0;

}
//main函数调用test_insert();

//test_insert()函数的实现
void test_insert() {
​	sqlink L;
​//定义一个结构体指针L
	
L = list_create();
//调用函数,创建一个顺序表

if (L == NULL) 
	return;
//如果L为空,返回

list_insert(L, 10, 0);
list_insert(L, 20, 0);
list_insert(L, 30, 0);
list_insert(L, 40, 0);
list_insert(L, 50, 0);
list_insert(L, 60, 0);
//插入数据

list_show(L);
//输出数据
list_insert(L, 100, -1000);
//插入数据
list_show(L);
//输出数据
list_delete(L);
//删除顺序表

}

链表

链表linklist.h文件

typedef int data_t;
//将int重命名为data_t
typedef struct node {
	data_t data;
	struct node * next;
}listnode, * linklist;
//定义了一个结构体node
//其中有两个成员一个data元素和指向下一个结构体的指针next
//将结构体重命名为listnode,其指针*linklist

linklist list_create();
//定义一个创建链表的函数,返回一个结构体指针
int list_tail_insert(linklist H, data_t value);
//定义一个插入元素的函数返回值为int类型,参数列表有指针H和数据value
linklist list_get(linklist H, int pos);
//定义一个得到pos位置的值的函数
int list_insert(linklist H, data_t value, int pos);
//定义一个在pos位置插入一个元素的函数
int list_show(linklist H);
//输出链表内容

链表linklist.c文件

#include <stdio.h>//C语言标准输入输出函数
#include <stdlib.h>//包含malloc函数的头文件
#include "linklist.h"//调用linklist.h头文件

//创建一个链表
linklist list_create() {
	linklist H;
//创建一个链表结构体指针

H = (linklist)malloc(sizeof(listnode));
//分配一个listnode结构体大小的空间,并将其强制装换为结构体指针类型赋予H
if (H == NULL) {
	printf("malloc failed\n");
	return H;
}
//如果H为空,输出分配空间失败,返回指针H
H->data = 0;
H->next = NULL;
//初始化指针,data为0,指针为NULL

return H;
//返回H结构体指针

}

//插入链表元素
int list_tail_insert(linklist H, data_t value) {
	linklist p;
	linklist q;
if (H == NULL) {
	printf("H is NULL\n");
	return -1;
}
//如果H指针为空,输出提示,返回-1
if ((p = (linklist)malloc(sizeof(listnode))) == NULL) {
	printf("malloc failed\n");
	return -1;
}
//分配一个listnode结构体大小的空间,并将其强制装换为结构体指针类型赋予p
//如果为空输出分配失败,返回-1
p->data = value;
//赋予p指针指向的结构体data,value值
p->next = NULL;
//赋予p指针指向的结构体next值,NULL值
q = H;
while (q->next != NULL) {
	q = q->next;
}
//找到链表最后的位置
q->next = p;
//将最后位置的元素的next指针指向p
return 0;
}

//查找pos位置的值
linklist list_get(linklist H, int pos) {
	linklist p;
	int i;
if (H == NULL) {
	printf("H is NULL\n");
	return NULL;
}
//如果为空输出分配失败
if (pos == -1) {
	return H;
}
//如果pos位置为-1,返回指针H
p = H;
i = -1;
while (i < pos) {
	p = p->next;
	if (p == NULL) {
		printf("pos is invalid\n");
		return NULL;
	}
	i++;
}
//遍历链表找到pos
return p;
//返回指针p
}

//在pos位置插入值value
int list_insert(linklist H, data_t value, int pos) {
	linklist p;
	linklist q;
if (H == NULL) {
	printf("H is NULL\n");
	return -1;
}
//如果为空输出分配失败
p = list_get(H, pos-1);
if (p == NULL) {
	return -1;
}
//查找pos位置的值
//如果为空,返回-1
if ((q = (linklist)malloc(sizeof(listnode))) == NULL) {
	printf("malloc failed\n");
	return -1;
}
//分配listnode的空间,并强制转换为结构体指针类型,赋值于q
//如果为空,返回-1
q->data = value;
q->next = NULL;
//给q赋值,next指向NULL
q->next = p->next;
p->next = q;
//将q放入链表中,并调整指针
return 0;

}

//输出链表元素
int list_show(linklist H) {
	linklist p;
if (H == NULL) {
	printf("H is NULL\n");
	return -1;
}
//如果H为空,输出提醒,返回-1
p = H;
while (p->next != NULL) {
	printf("%d ", p->next->data);
	p = p->next;
}
//输出并遍历链表
puts("");

return 0;

}

链表test.c文件

#include <stdio.h>//C语言标准输入输出头文件
#include "linklist.h"//调用linklist.h头文件

void test_get();//声明函数test_get()

int main(int argc, const char *argv[])
{
	linklist H;
	int value;
	


H = list_create();
if (H == NULL)
	return -1;

printf("input:");
while (1) {
	scanf("%d", &value);
	if (value == -1)
		break;
	list_tail_insert(H, value);
	printf("input:");
}
//main函数创建链表
//如果H为空返回-1
//当输入值合法时,循环输入,输入-1结束
//并将输入值插入到链表中
list_show(H);
//输出链表
list_insert(H, 100, 0);
//将链表中插入100
list_show(H);
//输出链表
return 0;


}

//实现test_get
void test_get() {
	linklist H;
	int value;
	linklist p;
	
H = list_create();
//H接受创建链表后的指针
if (H == NULL)
	return;

printf("input:");
while (1) {
	scanf("%d", &value);
	if (value == -1)
		break;
	list_tail_insert(H, value);
	printf("input:");
}

list_show(H);
//输出链表
p = list_get(H, 3);
//查找下标为3的值
if (p != NULL)
printf("value=%d\n", p->data);
}
//如果查找位置为空,输出提醒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值