头文件如下:
#pragma once
#ifndef __LIST_H__
#define __LIST_H__
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>
#endif
主要代码如下:
#include "list.h"
#define LIST_INIT_ISZE 5 //初始化大小
#define LISTADD 5 //增量
typedef int ElemType;
typedef struct {
ElemType *elem; //数组
int length; //当前长度
int listsize; //当前已分配大小(以sizeof(ElemType)为单位)
}ArrayList,*Sqlist;
enum position { effect, null };
void listInit(ArrayList* list); //表的初始化
int listEmpty(const ArrayList* list); //判断表是否为空
int listFull(const ArrayList* list); //判断表是否已满
void listPrint(const ArrayList* list); //输出表的内容
void listDestroy(ArrayList* list); //表的销毁,涉及内存分配,因此必须free
int listLength(const ArrayList* list); //获取表的长度
int listAdd(ArrayList* list); //表的扩容
void listInsert(ArrayList* list, int pos, ElemType e); //在表中i的位置插入元素e
ElemType listVisit(const ArrayList* list, int pos); //访问表中第i个元素,并返回元素的值
void listDelete(ArrayList* list, int pos); //删除表中位置为i的元素
void listRemoveAll(ArrayList* list, ElemType data); //删除表所有为data的元素
int listSerch(const ArrayList* list, ElemType e); //在表中查找元素e,返回其在表中的位置
void test2();
//int main()
//{
// printf("------------------动态顺序表测试------------------\n");
// test2();
// system("pause");
// return 0;
//}
void listInit(ArrayList* list) //表的初始化
{
assert(list); //判断list是否有效
list->elem = (ElemType *)malloc(sizeof(ElemType) * LIST_INIT_ISZE);
/*if (0 == list->elem) {
return;
}*/
memset(list->elem, 0, LIST_INIT_ISZE * sizeof(ElemType)); //将已开辟内存空间全部字节的值设为值0
list->listsize = LIST_INIT_ISZE;
list->length = 0;
}
void test2()
{
ArrayList list;
listInit(&list);
listPrint(&list);
printf("%d\n", listEmpty(&list));
listInsert(&list, 0, 1);
listInsert(&list, 1, 31);
listInsert(&list, 2, 13);
listInsert(&list, 0, 1);
listInsert(&list, 1, 31);
listInsert(&list, 2, 13);
listPrint(&list);
printf("%d\n", listFull(&list));
printf("%d\n", listLength(&list));
printf("%d\n", listSerch(&list, 31)); //查找并返回第一个位序
printf("%d\n", listVisit(&list, 2));
listDelete(&list, 2);
listDelete(&list, 2);
listPrint(&list);
listInsert(&list, 1, 31);
listInsert(&list, 1, 31);
listPrint(&list);
listRemoveAll(&list, 31);
listPrint(&list);
listDestroy(&list);
printf("%d\n", listLength(&list));
}
int listEmpty(const ArrayList* list) //判断表是否为空
{
assert(list);
return list->length == 0; //size==0 return 1;
}
int listFull(const ArrayList* list) //判断表是否已满
{
assert(list);
return list->length == list->listsize; //size==listsize return 1;
}
void listPrint(const ArrayList* list) //输出表的内容
{
assert(list);
for (int i = 0; i < list->length; i++)
{
printf("%d ", list->elem[i]);
}
printf("\n");
}
void listDestroy(ArrayList* list) //表的销毁,涉及内存分配,因此必须free
{
assert(list);
free(list->elem);
list->elem = NULL;
list->length = 0;
list->listsize = 0;
}
int listLength(const ArrayList* list) //获取表的长度
{
assert(list);
return list->length;
}
int listAdd(ArrayList* list) //表的扩容
{
assert(list);
if (!realloc(list->elem, (LIST_INIT_ISZE + LISTADD) * sizeof(ElemType))) //realloc 在原来的基础上申请所需的空间
{
list->listsize = list->listsize + LISTADD;
list->elem = 0;
memset(list->elem, 0, list->listsize);
return 1;
}
else
{
return 0;
}
}
void listInsert(ArrayList* list, int pos, ElemType e) //在表中i的位置插入元素e
{
assert(list);
if (pos < 0 || pos >list->length) {
printf("The ArrayList can't be inserted at the pos.\n");
}
if (listFull(list)) {
//申请空间
listAdd(list);
}
// 将元素插入到数组pos位置
for (int i = list->length; i > pos; i--)
{
list->elem[i] = list->elem[i - 1];
}
list->elem[pos] = e;
list->length++;
}
int listSerch(const ArrayList* list, ElemType e) //在表中查找元素e,返回其在表中的位置
{
assert(list);
for (int i = 0; i < list->length; i++)
{
if (list->elem[i] == e)
{
return i;
}
}
return -1;
}
ElemType listVisit(const ArrayList* list, int pos) //访问表中第i个元素,并返回元素的值
{
assert(list);
if (pos >= 0 && pos < list->length)
{
return list->elem[pos];
}
return null;
}
void listDelete(ArrayList* list, int pos) //删除表中位置为i的元素
{
assert(list);
if (pos >= 0 && pos < list->length)
{
for (int i = pos; i < list->length; i++)
{
list->elem[i] = list->elem[i + 1];
}
list->elem[list->length--] = 0;
}
}
void listRemoveAll(ArrayList* list, ElemType data) //删除表所有为data的元素
{
assert(list);
for (int i = 0; i < list->length; i++)
{
if (list->elem[i] == data)
{
//listDelete(list, i );
/*按位置删除,按0开始 若连续相同数字会出现问题,如31 31 31 31 要删除31 ,删除之后指针的前移会使后面转移到前面的31
无法被检测出来,所以不能直接调用删除函数。
修正:删除当前位置后,让i--,重复检测前一个位置,避免了遗漏。*/
for (int j = i; j < list->length; j++)
{
list->elem[j] = list->elem[j + 1];
}
list->elem[list->length--] = 0;
i--;
}
}
}