其實順序表的靜態實現以及動態實現和通訊錄的實現原理基本上是一致的,在這裏就不做過多的解釋,直接貼代碼。
靜態通訊錄:http://blog.csdn.net/quinn0918/article/details/71937767
動態通訊錄:http://blog.csdn.net/quinn0918/article/details/72182598
文件流通訊錄:http://blog.csdn.net/quinn0918/article/details/72526886
靜態順序表:
Seqlist.h頭文件
#ifndef __SEQLIST_H__
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#define MAX 100
typedef int DataType;
typedef struct Seqlist
{
DataType Data[MAX];
int sz;
}Seqlist,*pseqlist;
void InitSeqlist(pseqlist ps);//初始化順序表
void PushBack(pseqlist ps,DataType num);//尾部壓入
void PrintSeqlist(const pseqlist ps);//打印順序表
void PopBack(pseqlist ps);//尾部刪除
void PushFront(pseqlist ps, DataType num);//頭部插入
void PopFront(pseqlist ps);//頭部刪除
void Insert(pseqlist ps, int pos, DataType num);//指定位置插入
int Find(pseqlist ps, DataType num);//查找下標
void Remove(pseqlist ps, DataType num);//刪除所有指定元素
void ReverseSeqlist(pseqlist ps);//逆序
void SortSeqlist(pseqlist ps);//排序
int BinarySearch(pseqlist ps, DataType num);//二分查找
#endif //__SEQLIST_H__
Seqlist.h實現部分
#include "Seqlist.h"
void InitSeqlist(pseqlist ps)
{
assert(ps);
ps->sz = 0;
memset(ps->Data, 0, sizeof(ps->Data));
}
void PushBack(pseqlist ps, DataType num)
{
assert(ps);
if (ps->sz == MAX)
{
return;
}
ps->Data[ps->sz] = num;
ps->sz += 1;
}
void PrintSeqlist(const pseqlist ps)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
printf("%d ",ps->Data[i]);
}
printf("\n");
}
void PopBack(pseqlist ps)
{
assert(ps);
if (ps->sz == 0)
{
return;
}
ps->sz--;
}
void PushFront(pseqlist ps, DataType num)
{
assert(ps);
int i = 0;
if (ps->sz == MAX)
{
return;
}
for (i = ps->sz; i > 0; i--)
{
ps->Data[i] = ps->Data[i-1];
}
ps->Data[0] = num;
ps->sz++;
}
void PopFront(pseqlist ps)
{
assert(ps);
if (ps->sz)
{
int i = 0;
for (i = 0; i < ps->sz-1; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
}
void Insert(pseqlist ps, int pos, DataType num)
{
assert(ps);
int i = 0;
if (ps->sz == MAX)
{
return;
}
for (i = ps->sz; i > pos; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[pos] = num;
ps->sz++;
}
int Find(pseqlist ps, DataType num)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
if (ps->Data[i] == num)
{
return i;
}
}
return -1;
}
void Remove(pseqlist ps, DataType num)
{
assert(ps);
int i = 0;
int ret = 0;
if (ps->sz == 0)
{
return;
}
while ((ret = Find(ps, num))!=-1)
{
for (i = ret; i < ps->sz - 1; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
}
void ReverseSeqlist(pseqlist ps)
{
assert(ps);
int left = 0;
int right = ps->sz - 1;
while (left < right)
{
DataType tmp = ps->Data[left];
ps->Data[left] = ps->Data[right];
ps->Data[right] = tmp;
left++;
right--;
}
}
void SortSeqlist(pseqlist ps)
{
assert(ps);
int i = 0;
int j = 0;
for (i = 0; i < ps->sz; i++)
{
for (j = 0; j < ps->sz-i-1; j++)
{
if (ps->Data[j] > ps->Data[j + 1])
{
DataType tmp = ps->Data[j+1];
ps->Data[j+1] = ps->Data[j];
ps->Data[j] = tmp;
}
}
}
}
int BinarySearch(pseqlist ps, DataType num)
{
assert(ps);
int left = 0;
int right = ps->sz - 1;
while (left <= right)
{
int mid = left - (left - right);
if (ps->Data[mid] < num)
{
left = mid + 1;
}
else if (ps->Data[mid] > num)
{
right = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
test.c測試部分
#include "Seqlist.h"
void test()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushBack(&mylist, 1);//尾部插入元素
PushBack(&mylist, 2);
PushBack(&mylist, 3);
PushBack(&mylist, 4);
PushBack(&mylist, 5);
PrintSeqlist(&mylist);
PopBack(&mylist);//尾部刪除
PrintSeqlist(&mylist);
}
void test1()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 6);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
PrintSeqlist(&mylist);
PopFront(&mylist);//頭部刪除
PrintSeqlist(&mylist);
}
void test2()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 6);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
int num = Find(&mylist, 10);//查找
if (num !=-1)
Insert(&mylist, num, 11);//指定位置插入
PrintSeqlist(&mylist);
}
void test3()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 11);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 10);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
PrintSeqlist(&mylist);
Remove(&mylist, 10);//刪除所有指定元素
PrintSeqlist(&mylist);
ReverseSeqlist(&mylist);//逆序
PrintSeqlist(&mylist);
SortSeqlist(&mylist);//排序
PrintSeqlist(&mylist);
int num = BinarySearch(&mylist,11);//二分查找
if (num != -1)
Insert(&mylist, num, 2);
PrintSeqlist(&mylist);
}
int main()
{
//test();
//test1();
//test2();
test3();
system("pause");
return 0;
}
本人親測,一點問題也沒有!!!動態順序表馬上就來!!!!
動態順序表
Seqlist_D.h頭文件
#ifndef __SEQLIST_D_H__
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#define INIT 2
#define INIC 3
typedef int DataType;
typedef struct Seqlist
{
DataType *Data;
int sz;
int capa;
}Seqlist,*pseqlist;
void InitSeqlist(pseqlist ps);//初始化
void DestorySeqlist(pseqlist ps);//釋放內存
void PushBack(pseqlist ps, DataType num);//尾部壓入
void PrintSeqlist(const pseqlist ps);//打印順序表
void PopBack(pseqlist ps);//尾部刪除
void PushFront(pseqlist ps, DataType num);//頭部插入
void PopFront(pseqlist ps);//頭部刪除
void Insert(pseqlist ps, int pos, DataType num);//指定位置插入
int Find(pseqlist ps, DataType num);//查找下標
void Remove(pseqlist ps, DataType num);//刪除所有指定元素
void ReverseSeqlist(pseqlist ps);//逆序
void SortSeqlist(pseqlist ps);//排序
int BinarySearch(pseqlist ps, DataType num);//二分查找
#endif //__SEQLIST_D_H__
Seqlist_D.c實現部分
#include "Seqlist_D.h"
void InitSeqlist(pseqlist ps)
{
assert(ps);
ps->Data = (DataType*)malloc(sizeof(DataType)*INIT);
ps->sz = 0;
ps->capa = INIT;
}
void DestorySeqlist(pseqlist ps)
{
assert(ps);
if (ps->Data != NULL)
{
free(ps->Data);
ps->Data = NULL;
}
}
void check(pseqlist ps)//檢測動態內存分配
{
if (ps->sz == ps->capa)
{
DataType *tmp = (DataType *)realloc(ps->Data, (ps->capa + INIC)*sizeof(DataType));
//當實際個數和初始化的容量相等時用realloc增容
if (tmp == NULL)
{
printf("out of menory\n");
exit(1);
}
else
{
ps->Data = tmp;
ps->capa += INIC;
}
}
}
void PushBack(pseqlist ps, DataType num)
{
assert(ps);
check(ps);
ps->Data[ps->sz] = num;
ps->sz += 1;
}
void PrintSeqlist(const pseqlist ps)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
printf("%d ", ps->Data[i]);
}
printf("\n");
}
void PopBack(pseqlist ps)
{
assert(ps);
if (ps->sz == 0)
{
return;
}
ps->sz--;
}
void PushFront(pseqlist ps, DataType num)
{
assert(ps);
check(ps);
int i = 0;
for (i = ps->sz; i > 0; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[0] = num;
ps->sz++;
}
void PopFront(pseqlist ps)
{
assert(ps);
if (ps->sz)
{
int i = 0;
for (i = 0; i < ps->sz - 1; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
}
void Insert(pseqlist ps, int pos, DataType num)
{
assert(ps);
check(ps);
int i = 0;
for (i = ps->sz; i > pos; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[pos] = num;
ps->sz++;
}
int Find(pseqlist ps, DataType num)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
if (ps->Data[i] == num)
{
return i;
}
}
return -1;
}
void Remove(pseqlist ps, DataType num)
{
assert(ps);
int i = 0;
int ret = 0;
if (ps->sz == 0)
{
return;
}
while ((ret = Find(ps, num)) != -1)
{
for (i = ret; i < ps->sz - 1; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->sz--;
}
}
void ReverseSeqlist(pseqlist ps)
{
assert(ps);
int left = 0;
int right = ps->sz - 1;
while (left < right)
{
DataType tmp = ps->Data[left];
ps->Data[left] = ps->Data[right];
ps->Data[right] = tmp;
left++;
right--;
}
}
void SortSeqlist(pseqlist ps)
{
assert(ps);
int i = 0;
int j = 0;
for (i = 0; i < ps->sz; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->Data[j] > ps->Data[j + 1])
{
DataType tmp = ps->Data[j + 1];
ps->Data[j + 1] = ps->Data[j];
ps->Data[j] = tmp;
}
}
}
}
int BinarySearch(pseqlist ps, DataType num)
{
assert(ps);
int left = 0;
int right = ps->sz - 1;
while (left <= right)
{
int mid = left - (left - right);
if (ps->Data[mid] < num)
{
left = mid + 1;
}
else if (ps->Data[mid] > num)
{
right = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
test.c測試部分
#include "Seqlist_D.h"
void test()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushBack(&mylist, 1);//尾部插入元素
PushBack(&mylist, 2);
PushBack(&mylist, 3);
PushBack(&mylist, 4);
PushBack(&mylist, 5);
PrintSeqlist(&mylist);
PopBack(&mylist);//尾部刪除
PrintSeqlist(&mylist);
DestorySeqlist(&mylist);//釋放內存
}
void test1()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 6);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
PrintSeqlist(&mylist);
PopFront(&mylist);//頭部刪除
PrintSeqlist(&mylist);
DestorySeqlist(&mylist);//釋放內存
}
void test2()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 6);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
int num = Find(&mylist, 10);//查找
if (num != -1)
Insert(&mylist, num, 11);//指定位置插入
PrintSeqlist(&mylist);
DestorySeqlist(&mylist);//釋放內存
}
void test3()
{
Seqlist mylist;
InitSeqlist(&mylist);//初始化順序表
PushFront(&mylist, 11);//頭部插入
PushFront(&mylist, 7);
PushFront(&mylist, 8);
PushFront(&mylist, 10);
PushFront(&mylist, 9);
PushFront(&mylist, 10);
PrintSeqlist(&mylist);
Remove(&mylist, 10);//刪除所有指定元素
PrintSeqlist(&mylist);
ReverseSeqlist(&mylist);//逆序
PrintSeqlist(&mylist);
SortSeqlist(&mylist);//排序
PrintSeqlist(&mylist);
int num = BinarySearch(&mylist, 11);//二分查找
if (num != -1)
Insert(&mylist, num, 2);
PrintSeqlist(&mylist);
DestorySeqlist(&mylist);//釋放內存
}
int main()
{
//test();
//test1();
//test2();
test3();
system("pause");
return 0;
}
到這裏靜態和動態的順序表就結束了,在代碼中我都加入了好幾個測試環節,貼測試結果的話圖會很多,又由於代碼有點長,程序測試結果就不往上貼了,讀者要是不放心的話儘管測一下。