您的位置:首页 > 编程语言 > C语言/C++

单链表(C语言)

2016-03-28 20:04 387 查看
单链表:单向无循环,最后置于空
//SeqList.h
#pragma once
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#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<pSeq->_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<pSeq->_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<pSeq->_size;++i)
{
if(pSeq->_array[i]==x)
{
int start=i;
for(;start<pSeq->_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<pSeq->_size;++i)
//{
//	if(pSeq->_array[i]==x)
//	{
//		int start=i;
//		for(;start<pSeq->_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<pSeq->_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<pSeq->_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<pSeq->_size;++i)
{
if(i==pos)
{
int start=i;
for(;start<pSeq->_size;++start)
{
pSeq->_array[start]=pSeq->_array[start+1];
}
--pSeq->_size;
return;
}
}
}
//Test.cpp 测试用例
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 单链表 增删查改