码迷,mamicode.com
首页 > 编程语言 > 详细

单链表(C语言)

时间:2016-03-28 22:06:19      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:单链表 c 增删查改

单链表:单向无循环,最后置于空

//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;
}


本文出自 “花开彼岸” 博客,请务必保留此出处http://zxtong.blog.51cto.com/10697148/1757666

单链表(C语言)

标签:单链表 c 增删查改

原文地址:http://zxtong.blog.51cto.com/10697148/1757666

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!