单链表:单向无循环,最后置于空
//SeqList.h#pragma once
#include
#include
#include
#define MAX_SIZE 100
typedef int DataType;
typedef struct Seqlist
{
DataType *_array;
size_t _size;
size_t _capacity;
}Seqlist;
void InitSeqlist(Seqlist *pSeq)//初始化
{
assert(pSeq);
pSeq->_capacity=MAX_SIZE;
pSeq->_array=(DataType*)malloc(sizeof(DataType)*pSeq->_capacity);
pSeq->_size=0;
}
void print(Seqlist *pSeq)//输出各数
{
int i=0;
assert(pSeq);
for(;i_size;++i)
{
printf("%d ",pSeq->_array[i]);
}
printf("\n");
}
void WideCapacity(Seqlist *pSeq)//增容
{
if(pSeq->_size>=pSeq->_capacity)
{
DataType *tmp=0;
pSeq->_capacity*=2;
tmp=(DataType *)malloc(sizeof(DataType)*pSeq->_capacity);
memcpy(tmp,pSeq->_array,sizeof(DataType)*pSeq->_size);
free(pSeq->_array);
pSeq->_array=tmp;
}
}
void PushBack(Seqlist *pSeq,DataType x)//尾部增加
{
assert(pSeq);
if(pSeq->_size>=pSeq->_capacity)
{
WideCapacity(pSeq);
}
pSeq->_array[pSeq->_size++]=x;
}
void PopBack(Seqlist *pSeq)//尾部删除
{
assert(pSeq);
if(pSeq->_size==0)
{
printf("该顺序表已空,无法删除!\n");
return;
}
--pSeq->_size;
}
void PushFront(Seqlist *pSeq,DataType x)//首部增加
{
int i=pSeq->_size;
assert(pSeq);
if(pSeq->_size>=pSeq->_capacity)
{
WideCapacity(pSeq);
}
for(;i>0;--i)
{
pSeq->_array[i]=pSeq->_array[i-1];
}
pSeq->_array[0]=x;
++pSeq->_size;
}
void PopFront(Seqlist *pSeq)//首部删除
{
int i=0;
assert(pSeq);
if(pSeq->_size==0)
{
printf("该顺序表已空,无法删除!\n");
return;
}
for(;i_size;++i)
{
pSeq->_array[i]=pSeq->_array[i+1];
}
--pSeq->_size;
}
void Insert(Seqlist *pSeq,size_t pos,DataType x)//插入
{
int i=pSeq->_size-1;
assert(pSeq);
assert(pos<=pSeq->_size);
if(pSeq->_size>=pSeq->_capacity)
{
WideCapacity(pSeq);
}
for(;i>=(int)pos;--i)
{
pSeq->_array[i+1]=pSeq->_array[i];
}
pSeq->_array[pos]=x;
++pSeq->_size;
}
void Remove(Seqlist *pSeq,DataType x)//删除某个数(第一个)
{
int i=0;
assert(pSeq);
assert(pSeq->_size!=0);
for(;i_size;++i)
{
if(pSeq->_array[i]==x)
{
int start=i;
for(;start_size;++start)
{
pSeq->_array[start]=pSeq->_array[start+1];
}
--pSeq->_size;
return;
}
}
}
void RemoveAll(Seqlist *pSeq,DataType x)//删除某个数(全部)
{
/ 第一种方法: //
//int i=0;
//assert(pSeq);
//assert(pSeq->_size!=0);
//for(;i_size;++i)
//{
//if(pSeq->_array[i]==x)
//{
//int start=i;
//for(;start_size;++start)
//{
//pSeq->_array[start]=pSeq->_array[start+1];
//}
//--pSeq->_size;
//--i;
//}
//}
/// 第二种方法: /
int count=0;
int firstIndex=0;
int nextIndex=0;
assert(pSeq);
assert(pSeq->_size!=0);
while(nextIndex_size)
{
if(pSeq->_array[nextIndex]==x)
{
--pSeq->_array[nextIndex];
}
else
{
pSeq->_array[firstIndex]=pSeq->_array[nextIndex];
++firstIndex;
count++;
}
++nextIndex;
}
pSeq->_size=count;
}
int Find(Seqlist *pSeq,DataType x)//查找某个数
{
int i=0;
assert(pSeq);
assert(pSeq->_size!=0);
for(;i_size;++i)
{
if(pSeq->_array[i]==x)
{
return 1;
}
}
}
void Modify(Seqlist *pSeq,size_t pos,DataType x)//修改数据
{
int i=0;
assert(pSeq);
assert(pos<=pSeq->_size);
assert(pSeq->_size!=0);
for(;i<=(int)pos;++i)
{
if(i==pos)
{
pSeq->_array[i]=x;
}
}
}
void Erase(Seqlist *pSeq,size_t pos)//抹除某个下标的值
{
int i=0;
assert(pSeq);
assert(pos<=pSeq->_size);
assert(pSeq->_size!=0);
for(;i_size;++i)
{
if(i==pos)
{
int start=i;
for(;start_size;++start)
{
pSeq->_array[start]=pSeq->_array[start+1];
}
--pSeq->_size;
return;
}
}
}
//Test.cpp 测试用例#define _CRT_SECURE_NO_WARNINGS
#include
#include "Seqlist.h"
void Test1()//尾部操作
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,4);
print(&s);
PopBack(&s);
print(&s);
}
void Test2()//首部操作
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,4);
PushFront(&s,3);
PushFront(&s,2);
PushFront(&s,1);
PushFront(&s,0);
print(&s);
PopFront(&s);
print(&s);
}
void Test3()//任意位置操作
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,4);
PushFront(&s,2);
PushFront(&s,2);
PushFront(&s,3);
PushFront(&s,2);
PushFront(&s,1);
print(&s);
Insert(&s,1,0);
print(&s);
Remove(&s,2);
print(&s);
RemoveAll(&s,2);
print(&s);
}
void Test4(int k)//查找
{
int ret=0;
Seqlist s;
InitSeqlist(&s);
PushFront(&s,4);
PushFront(&s,3);
PushFront(&s,2);
PushFront(&s,1);
PushFront(&s,0);
print(&s);
ret=Find(&s,k);
if(ret==1)
{
printf("该顺序表中存在该数!\n");
}
else
{
printf("该顺序表中不存在该数!\n");
}
}
void Test5()//修改、抹除
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,3);
PushFront(&s,2);
PushFront(&s,1);
PushFront(&s,0);
print(&s);
Modify(&s,3,1);
print(&s);
Erase(&s,1);
print(&s);
}
int main()
{
int k=0;
printf("尾部操作 \n");
Test1();
printf("首部操作 \n");
Test2();
printf("任意位置操作 \n");
Test3();
printf("查找某数 \n");
printf("请输入数字:");
scanf("%d",&k);
Test4(k);
printf("修改某数、抹除下标的值 \n");
Test5();
system("pause");
return 0;
}