简单实现静态顺序表的基本操作:初始化,销毁,增删改查等操作。
SeqList.h
#ifndef _SEQLIST_H_ #define _SEQLIST_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE];//存数据的空间 int size;//1.顺序表中有效元素的个数 2.当前可用的数组下标 }SeqList; void SeqListInit(SeqList *pSL);//初始化 void SeqlistDestroy(SeqList *pSL);//销毁 //插入 void SeqListPushBack(SeqList *pSL,DataType data);//尾插 void SeqListPushFront(SeqList *pSL,DataType data);//头插 void SeqListInsert(SeqList *pSL,int pos,DataType data);//根据下标插入 //删除 void SeqListPopBack(SeqList *pSL);//尾删 void SeqListPopFront(SeqList *pSL);//头删 void SeqListErase(SeqList *pSL, int pos);//根据下标删除 void SeqListRemove(SeqList *pSL,DataType data);//根据数据删除,删除遇到的第一个 void SeqListRemoveAll(SeqList *pSL,DataType data);//根据数据删除,删除所有指定数据 //修改 void SeqListUpdate(SeqList *pSL,int pos,DataType data);//根据下标更新数据 //查询 int SeqListFind(SeqList *pSL,DataType data);//返回遇到的第一个下标,若没有遇到,就返回-1 SeqList.c
#include "Seqlist.h" void SeqListPrint(SeqList *pSL) { int i ; for (i = 0; i < pSL->size; i++) { printf("%d ", pSL->array[i]); } printf("\n"); } void SeqListInit(SeqList *pSL)//初始化 { assert(pSL != NULL); memset(pSL->array, 0, MAX_SIZE*sizeof(DataType)); pSL->size = 0; } void SeqlistDestroy(SeqList *pSL)//销毁 { assert(pSL != NULL); pSL->size = 0; } void SeqListPushBack(SeqList *pSL, DataType data)//尾插 { assert(pSL != NULL); assert(pSL->size < MAX_SIZE); pSL->array[pSL->size] = data; pSL->size++; } void SeqListPushFront(SeqList *pSL, DataType data)//头插 { assert(pSL != NULL); assert(pSL->size < MAX_SIZE); //将已知数据往后移 //1.以条件写循环 #if 0 int pos;//以搬移的数做循环指示 for (pos = pSL->size - 1; pos >= 0; pos--) { pSL->array[pos + 1] = pSL->array[pos]; } #endif #if 0 int space;//以搬到的位置做循环指示 for(space = pSL->size; space > 0; space--) { pSL->array[space] = pSL->array[space - 1]; } #endif #if 2 //2.以循环次数做循环指示 int i; for (i = 0; i < pSL->size; i++) { pSL->array[pSL->size - i] = pSL->array[pSL->size - i - 1]; } #endif pSL->array[0] = data; pSL->size++; } void SeqListInsert(SeqList *pSL, int pos, DataType data)//根据下标插入 { assert(pSL != NULL); assert(pSL->size < MAX_SIZE); int space; for (space = pSL->size; space>pos; space--) { pSL->array[space] = pSL->array[space - 1]; } pSL->array[pos] = data; pSL->size++; } void SeqListPopBack(SeqList *pSL)//尾删 { assert(pSL != NULL); assert(pSL->size > 0); pSL->size--; } void SeqListPopFront(SeqList *pSL)//头删 { assert(pSL != NULL); int pos; for (pos = 1; pos < pSL->size; pos++) { pSL->array[pos - 1] = pSL->array[pos]; } pSL->size--; } void SeqListErase(SeqList *pSL, int pos)//根据下标删除 { assert(pSL != NULL); assert(pSL->size>0); int i; for (i = pos; pos < pSL->size - 1; pos++) { pSL->array[pos] = pSL->array[pos + 1]; } pSL->size--; } void SeqListRemove(SeqList *pSL, DataType data)//根据数据删除,删除遇到的第一个 { int pos = SeqListFind(pSL, data); if (pos != -1) { SeqListErase(pSL, pos); } } void SeqListRemoveAll(SeqList *pSL, DataType data)//根据数据删除,删除所有指定数据 { #if 0 for (i = 0, j = 0; i < pSL->size; i++) { if (pSL->array[i] != data) { pSL->array[j] = pSL->array[i]; j++; } } pSL->size = j; #endif #if 1 int i = 0; int count = 0; for (i = 0; i < pSL->size; i++) { if (pSL->array[i] == data) { count++; } else { pSL->array[i - count] = pSL->array[i]; } pSL->size -= count; } #endif } void SeqListUpdate(SeqList *pSL, int pos, DataType data)//根据下标更新数据 { assert(pSL != NULL); assert(pos >= 0 && pos < pSL->size); pSL->array[pos] = data; } int SeqListFind(SeqList *pSL, DataType data)//返回遇到的第一个下标,若没有遇到,就返回-1 { assert(pSL != NULL); int i; for (i = 0; i < pSL->size; i++) { if (pSL->array[i] == data) { return i; } } return -1; } 测试代码:
int main() { SeqList S; SeqListInit(&S); SeqListPrint(&S); //尾插 SeqListPushBack(&S,1); SeqListPushBack(&S,3); SeqListPushBack(&S,4); SeqListPushBack(&S,3); SeqListPushBack(&S,5); SeqListPushBack(&S,7); SeqListPushBack(&S, 8); SeqListPushBack(&S, 0); SeqListPushBack(&S, 9); SeqListPushBack(&S, 3); SeqListPrint(&S); //头插 SeqListPushFront(&S, 4); SeqListPushFront(&S, 7); SeqListPushFront(&S, 0); SeqListPrint(&S); //根据下标插入 SeqListInsert(&S, 2,6); SeqListInsert(&S, 4,5); SeqListPrint(&S); //尾删 SeqListPopBack(&S); SeqListPrint(&S); //头删 SeqListPopFront(&S); SeqListPopFront(&S); SeqListPrint(&S); //根据下标删除 SeqListErase(&S, 4); SeqListErase(&S, 7); SeqListPrint(&S); //根据数据删除,删除遇到的第一个 SeqListRemove(&S, 5); SeqListPrint(&S); //根据数据删除,删除所有指定数据 SeqListRemoveAll(&S, 5); SeqListPrint(&S); //根据下标更新数据 SeqListUpdate(&S,1,8); SeqListUpdate(&S,3,0); SeqListPrint(&S); //查询 printf("%d\n", SeqListFind(&S, 3)); //销毁顺序表 SeqlistDestroy(&S); system("pause"); return 0; } 文章来源: 数据结构之实现顺序表的简单操作函数