码迷,mamicode.com
首页 > 其他好文 > 详细

动态链表

时间:2015-07-01 22:16:21      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

DynSeqlist.h


#ifndef __DYNSEQLIST_H__
#define __DYNSEQLIST_H__

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>
#define SIZE 5
typedef int DataType;
typedef struct seqlist
{
	DataType* array;
	size_t size;	//有效值
	size_t capacity;//总容量
}seqlist;
typedef enum tag
{
	one,//删去第一个
	more,//全部都删去
}Tag;
void Init(seqlist* pSeq);
void CheckExpand(seqlist* pSeq);
void Destory(seqlist* pSeq);
void Print(seqlist* pSeq);
void PushBack(seqlist* pSeq, DataType x);
void PushFront(seqlist* pSeq, DataType x);
void Insert(seqlist* pSeq, size_t index, DataType x);
void PopBack(seqlist* pSeq);
void PopFront(seqlist*pSeq);
void removed(seqlist* pSeq, size_t index);
void Modify(seqlist* pSeq, size_t index, DataType x);
void Erase(seqlist* pSeq, DataType x, Tag all);
int Find(seqlist* pSeq, DataType x,size_t index);
void swap(DataType* x, DataType* y);
void BubbleSort(seqlist* pSeq);//冒泡排序升序
void SelectSort(seqlist* pSeq);//选择排序降序
int BinarySearch(seqlist* pSeq, DataType x);//二分查找时用升序测试
#endif		//__DYNSEQLIST_H__

DynSeqlist.c


#include"DynSeqlist.h"
void Init(seqlist* pSeq)
{
	assert(pSeq);
	pSeq->array = (DataType *)malloc(SIZE*sizeof(DataType));
	memset(pSeq->array, 0, SIZE*sizeof(DataType));
	pSeq->size = 0;
	pSeq->capacity = SIZE;
}
void CheckExpand(seqlist* pSeq)
{
	assert(pSeq);
	DataType* S;
	if (pSeq->size == pSeq->capacity)
	{
		S = (DataType*)malloc(2 * pSeq->capacity *sizeof(DataType));
		memcpy(S, pSeq->array, SIZE*sizeof(DataType));
		free(pSeq->array );
		pSeq->array = S;
		pSeq->capacity = 2 * pSeq->capacity;
	}
}
void Destory(seqlist* pSeq)
{
	assert(pSeq);
	if (pSeq->array != NULL)
	{
		free(pSeq->array );
	}
}
void Print(seqlist* pSeq)
{
	assert(pSeq);
	size_t i=0;
	for (; i < pSeq->size; i++)
	{
		printf("%d ", pSeq->array[i]);
	}
	printf("\n");
}
void PushBack(seqlist* pSeq, DataType x)
{
	assert(pSeq);
	assert(pSeq->size < pSeq->capacity);
	pSeq->array[pSeq->size] = x;
	pSeq->size++;
}
void PushFront(seqlist* pSeq, DataType x)
{
	assert(pSeq);
	assert(pSeq->size < pSeq->capacity);
	int i = pSeq->size - 1;
	for (; i >= 0; i--)
	{
		pSeq->array[i + 1] = pSeq->array[i];
	}
	pSeq->array[0] = x;
	pSeq->size++;
}
void Insert(seqlist* pSeq, size_t index, DataType x)
{
	assert(pSeq);
	assert(index < pSeq->size);
	size_t i = pSeq->size;
	for (; i > index; i--)
	{
		pSeq->array[i] = pSeq->array[i - 1];
	}
	pSeq->array[index] = x;
	pSeq->size++;
}
void PopBack(seqlist* pSeq)
{
	assert(pSeq);
	pSeq->size--;
}
void PopFront(seqlist*pSeq)
{
	assert(pSeq);
	size_t i = 0;
	for (; i < pSeq->size; i++)
	{
		pSeq->array[i] = pSeq->array[i + 1];
	}
	pSeq->size--;
}
void removed(seqlist* pSeq, size_t index)
{
	assert(pSeq);
	assert(index <  pSeq->size);
	size_t i = index;
	for (; i <pSeq->size ; i++)
	{
		pSeq->array[i] = pSeq->array[i + 1];
	}
	pSeq->size--;
}
void Modify(seqlist* pSeq, size_t index, DataType x)
{
	assert(pSeq);
	assert(index < pSeq->size);
	pSeq->array[index] = x;
}
//返回的值为-1时,找不到此元素;否则返回的值为找到的元素的下标。
int Find(seqlist* pSeq, DataType x, size_t index)
{
	assert(pSeq);
	size_t i = 0;
	for (; i < pSeq->size; i++)
	{
		if (pSeq->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}
void Erase(seqlist* pSeq, DataType x, Tag all)
{
	assert(pSeq);
	size_t i = 0;
	int ret ;
	if (pSeq->size == 0)
	{
		printf("链表为空\n");
		return;
	}
	ret = Find(pSeq, x, 0);
	if (ret == -1)
	{
		printf("表中找不到这个元素\n");
	}
	else if (all == one)
	{
		removed(pSeq, ret);
	}
	else
	{
		while (ret != -1)
		{
			removed(pSeq, ret);
			ret = Find(pSeq, x, ret);

		}
	}
}
void swap(DataType* x, DataType* y)
{
	DataType temp =*x;
	*x = *y;
	*y = temp;
}
void BubbleSort(seqlist* pSeq)
{
	assert(pSeq);
	size_t i = 0; 
	size_t j = 0;
	for (i = 0; i < pSeq->size - 1; i++)
	{
		for (j = 0; j < pSeq->size-i-1; j++)
		{
			if (pSeq->array[j]>pSeq->array[j+1])
			{
				swap(&(pSeq->array[j]), &(pSeq->array[j + 1]));
			}
		}
	}
}
void SelectSort(seqlist* pSeq)
{
	assert(pSeq);
	size_t i = 0;
	size_t j = 0;
	size_t max;
	for (i = 0; i < pSeq->size-1; i++)
	{
		max = i;
		for (j = i + 1; j < pSeq->size; j++)
		{
			if (pSeq->array [max]< pSeq->array[j])
			{
				max = j;
			}
		}
		if (max != i)
		{
			swap(&(pSeq->array[max]), &(pSeq->array[i]));
		}
	}
}
//返回的值为-1时,找不到此元素;否则返回的值为要找的元素的下标
int BinarySearch(seqlist* pSeq, DataType x)
{
	assert(pSeq);
	DataType left = 0;
	DataType right = pSeq->size - 1;
	DataType mid = left + (right - left) / 2;//这种写法的原因
	while (left <= right)
	{
		DataType mid = left + (right - left) / 2;
		if (pSeq->array[mid] == x)
		{
			return mid;
		}
		if (pSeq->array[mid] < x)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}
	



void Test()
{
	seqlist s;
	int ret = 0;
	Init(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PushBack(&s, 3);
	CheckExpand(&s);
	PushBack(&s, 5);
	PushBack(&s, 3);
	PushBack(&s, 6);
	Print(&s);
	PushFront(&s, 99);
	Print(&s);
	Insert(&s, 0, 120);
	Print(&s);
	PopBack(&s);
	Print(&s);
	PopFront(&s);
	Print(&s);
	removed(&s, 5);
	Print(&s);
	Modify(&s, 1, 24);
	Print(&s);
	Erase(&s, 3, more); 
	Print(&s);
	SelectSort(&s);
	Print(&s);
	BubbleSort(&s);
	Print(&s);
	ret=BinarySearch(&s, 2);
	printf("ret=%d\n", ret);
}

void main()
{
	Test();
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

动态链表

标签:

原文地址:http://blog.csdn.net/kkmdmcgxi/article/details/46714447

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