单链表概述
这是我的一个单链表的操作实现的代码,之后,我会再次练习这段代码,对其进行分类和内化。
include<stdio.h>
include<stdlib.h>
// 结构申明
typedef int Element_t;
//定义顺序表的表头结构:
typedef struct {
Element_t* data; //这个有什么用?存储表空间的首地址
int pos; //指向表空间中待插入位置的索引号
int capacity; //顺序表的最大容量,一旦超过这个容量,触发扩容操作
}SEQTable_t;
// 函数接口的实现
SEQTable_t* CreateSeqTable(int n) {
SEQTable_t* table = malloc(sizeof(SEQTable_t));
if (table == NULL) {
printf("malloc error\n");
return NULL;
}
table->data = malloc(sizeof(Element_t) * n);
table->capacity = n;
table->pos = 0;
return table;
}
void releaseSeqTable(SEQTable_t* table) {
if (table->data) {
free(table->data);
}
free(table);
}
static int enlargerTable(SEQTable_t* table) {
//1.再申请一个更大的空间
Element_t* tmp = malloc(sizeof(Element_t)(table->capacity2));
if (tmp == NULL) {
printf("enlargerTable malloc failed!\n");
return -1;
}
//2.拷贝老空间里的内容到新空间里
memcpy(tmp, table->data, sizeof(Element_t)*table->pos);
//3.释放老空间,让表头里的data指向新空间
table->capacity *= 2;
free(table->data);
table->data = tmp;
return 0;
}
//尾插法
int pushbackSeqTable(SEQTable_t* table, Element_t value) { //这儿为什么要用指针?
//1.空间根本就不存在
if (table == NULL || table->data == NULL) {
printf("table is NULL!\n");
return - 1;
}
//2.空间已经满了,再插入就要溢出了,应该扩容
if (table->pos >= table->capacity&&enlargerTable(table)) {
return -1;
}
table->data[table->pos] = value;
++table->pos;
return 0;
}
//任意位置插入,慎用
int insertPosSeqTable(SEQTable_t* table, int index, Element_t value) {
//空间有效性
if (table == NULL || table->data == NULL) {
return -1;
}
if (index<0 || index>table->pos) {
printf("index invalid!\n");
return -1;
}
//是否扩容
if (table->pos >= table->capacity&&enlargerTable(table)) {
return -1;
}
//搬移数据,为新数据腾出位置,从后往前,向后挪动
//[pos-1,index] for循环--
for (int i = table->pos - 1;i >= index;--i) {
table->data[i + 1] = table->data[i];
}
table->data[index] = value;
++table->pos;
}
int findSeqTable(const SEQTable_t* table, Element_t value) {
for (int i = 0;i < table->pos;++i){
if (table->data[i] == value) {
return i;
}
}
return -1;
}
int deleteSeqTable(SEQTable_t* table, Element_t value) {
//1.查找value在table中的索引号
int index=findSeqTable(table,value);
if (index == -1) {
printf("not find %d element!\n",value);
return -1;
}
//2.删除这个元素,把[index+1,pos]搬移到[index,pos-1],从后一个往前覆盖
for (int i = index + 1;i < table->pos;i++) {
table->data[i - 1] = table->data[i];
}
--table->pos;
return 0;
}
void showSeqTable(const SEQTable_t* table) {
printf("pos/capacity:%d/%d\n", table->pos, table->capacity);
for (int i = 0;i < table->pos;i++) {
printf("%d ", table->data[i]);//数据域
}
printf("\n");
}
// main函数的测试
int main() {
SEQTable_t* table = CreateSeqTable(5);
for (int i = 0;i < 5;++i) {
pushbackSeqTable(table, i + 100);
}
showSeqTable(table);
printf("========================\n");
insertPosSeqTable(table, 3, 500);
//pushbackSeqTable(table, 500);
showSeqTable(table);
printf("************************\n");
deleteSeqTable(table, 103);
showSeqTable(table);
releaseSeqTable(table);
return 0;
}
/*
数据结构就给个头,内部被隐藏
接口:先写核心代码
顺序表的插入和删除效率很低,最好是尾插和尾删
做题时要结合画图进行
*/
代码量:200
练习时间:2.5h
知识点:对单链表操作的代码实现
浙公网安备 33010602011771号