顺序表:用一段地址连续存储单元依次存储数据元素的线性结构
//seqlist.h #pragma once//防止头文件重复包含 #define MAX_SIZE 10 #include<assert.h> #include<stdio.h> #include<stdlib.h>
实现基于静态数组的顺序表的以下基本操作:
首先先定义一个结构体类型seqlist( arr【】,size(有效的元素个数)),
预定义一个数组的最大长度,将整型数据变量typedef为datatype,为了以后在插入删除别的类型时方便修改
- 初始化 void InitSeq(seqlist *s)
将数组的size置为0,不需要给每个元素进行赋值, - 尾插 void SeqListPushBack(seqlist *s,int data)
首先要判断是否为空数组,并且是否有空余位置插入,将数组的size+1,把元素放入最后一个位置。 - 尾删void SeqListPophBack(seqlist *s)
只需将size-1即可,也得先判断是否为空数组 - 头插 void SeqListPushFront(seqlist *s, int data)
首先要判断是否为空数组,并且是否有空余位置插入。把数组整体向后移一位(先移动最后一个元素),将第0号元素空出来,把需要插入的元素放入即可,size++。 - 头删 void SeqListPopFront(seqlist *s)
判断是否为空数组,若不是,把后边的元素整体向前移(先移动第一个元素),size--。 - 查找任意位置元素 void SeqListFind(seqlist *s, int pos)
判断是否为空数组,直接输出给定位置的元素还得判断给的位置是否超出数组最大范围 - 修改任意位置元素void UpdateData(seqlist *s, int pos, int data)
判断是否为空数组还得判断给的位置是否超出数组最大范围, 先找到这个位置元素,将其值进行修改, - 查找指定元素值的下标void SeqListFind(seqlist *s, int data)
判断是否为空数组还得判断给的位置是否超出数组最大范围,给定一个元素,遍历,判断是否与数组内的元素相等,若不相等,count++, -
在任意位置插入元素void SeqListInsert(seqlist *s, int pos,int data)
首先要判断是否为空数组,并且是否有空余位置插入还得判断给的位置是否超出数组最大范围,将(下标+1)的元素依次向后移动,再将给定元素插入给定位置,size+1;
10.在任意位置删除元素 void SeqListDelete(seqlist *s,int pos)
要判断是否为空数组,将给定位置的下一个元素向前覆盖,依次到最后一个元素,size-1。
#include"seqlist.h" typedef int DataType; typedef struct SeqList { int arr[MAX_SIZE]; // 最大元素个数 int size; //有效元素个数 }seqlist;
以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。
各种函数主体:
void InitSeq(seqlist *s)//初始化静态线性表 { assert(s); if(s == NULL) { return; } s->size = 0; } void SeqListPrint(seqlist *s)//打印整个数组 { size_t i = 0; assert(s); for(;i < s->size;i++) { printf("%d",s->arr[i]); } printf("\n"); } void SeqListPopBack(seqlist *s)//尾删 { assert(s); if(s == NULL) { return; } s->size--; } void SeqListPushBack(seqlist *s,DataType data)//尾部插入 { assert(s); if(s == NULL) { return ; } if(s->size > MAX_SIZE) { return; } s->arr[s->size] = data;//size为有效元素个数,从0开始,相当于最后一个为空元素,所以可以直接赋值 s->size++; //指向size下一个空元素 } void SeqListPushFront(seqlist *s,int data)//头插 { int i = 0; assert(s); if(s == NULL) { return; } if(s->size>MAX_SIZE) { return; } ++s->size; for(i = s->size;i>0;i--) { s->arr[i] = s->arr[i - 1]; } s->arr[0] = data; } void SeqListPopFront(seqlist *s)//头删 { int i = 0; assert(s); if (s == NULL) { return; } for ( i = 1; i <= s->size; i++) { s->arr[i - 1] = s->arr[i]; } s->size--; } int SeqListFind(seqlist *s,int data)//查找指定元素 { int i = 0; assert(s); if(s == NULL) { return -1; } for(i=0;i<s->size;i++) { if(s->arr[i] == data) { return i; } } return -2; } void SeqListInsert(seqlist *s,int pos,int data)//任意(pos)位置插入 { int i = 0; if((s == NULL)||!((pos <= s->size) && pos >= 0)) { printf("数据越界"); return ; } if(10 == s->size ) { printf("表以满"); } s->size++; for(i = s->size;i>pos;i--) { s->arr[i] = s->arr[i - 1]; } s->arr[pos] = data; } void SeqListDelete(seqlist *s,int pos)//删除下标为pos的元素 { int i = 0; assert(s); if(s ==NULL) { return; } for(i = pos;i<s->size;i++) { s->arr[i] = s->arr[i + 1]; } s->size--; } void SeqListRemoveall(seqlist *s,int data)//删除所有data元素 { int i = 0; int count = 0; assert(s); for(i=0;i<s->size;i++) { if(s->arr[i] == data) { count++; } else { s->arr[i - count] = s->arr[i];//发现几个data向前移动几个 } s->size -= count; } } int BinarySearch(seqlist *s,int data) { int left = 0; int right = s->size; while(left<right) { int mid = left + ((right - left) >> 1); if(data == s->arr[data]) { return mid; } else if(data>mid) { left = mid + 1; } else { right = mid ; } } return 0; }
测试部分:
void test() { seqlist s; int tmp; InitSeq(&s); SeqListPushBack(&s,1); SeqListPushBack(&s,2); SeqListPushBack(&s,3); SeqListPushBack(&s,4); printf("初始化,尾插后的数组: \n"); SeqListPrint(&s); printf("/////////////\n"); SeqListPopBack(&s); printf("尾删后的数组:\n"); SeqListPrint(&s); printf("/////////////\n"); SeqListPushFront(&s,0); printf("头插后的数组:\n"); SeqListPrint(&s); printf("/////////////\n"); SeqListPopFront(&s); printf("头删后的数组: \n"); SeqListPrint(&s); printf("////////////\n"); tmp = SeqListFind(&s,2); printf("arr[1]的元素位置为:%d\n",tmp); printf("////////////\n"); SeqListInsert(&s,0,9); printf("任意位置插入后的数组: \n"); SeqListPrint(&s); printf("////////////\n"); SeqListDelete(&s,0); printf("删除位置为0元素的数组: \n"); SeqListPrint(&s); printf("////////////\n"); SeqListPushBack(&s,1); SeqListPushBack(&s,2); SeqListPushBack(&s,1); SeqListPushBack(&s,2); printf("删除前数前:"); SeqListPrint(&s); SeqListRemoveall(&s,2); printf("删除所有data元素后: \n"); SeqListPrint(&s); }主函数:
int main() { test(); system("pause"); return 0; }