动态链表!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define DATA_TYPE int
#define MAX_CAPACITY 5
typedef struct SeqList
{
	DATA_TYPE* _array;//数据块指针
	size_t _size;//当前有效的数据个数
	size_t _capacity;//容量
}SeqList;
void InitSeqList(SeqList* seq);//初始化
void PrintSeqList(SeqList* seq);//打印
void PushBack(SeqList* seq, DATA_TYPE x);//尾插
void PopBack(SeqList* seq);//尾删
void PushFront(SeqList* seq, DATA_TYPE x);//头插
void PopFront(SeqList* seq);//头删
void Insert(SeqList* seq, size_t pos, DATA_TYPE x);//在指定位置插入x
void RemoveAll(SeqList* seq, DATA_TYPE x);//删除所有的x
void Erase(SeqList* seq, size_t pos);//删除pos位置的置
void BubbleSort(SeqList* seq);//冒泡排序
void SelectSort(SeqList* seq);//选择排序
int  BinarySearch(SeqList* seq, DATA_TYPE x);//二分法
void CheckCapacity(SeqList* seq);//容量检查
void Swap(DATA_TYPE *i, DATA_TYPE *j)
{
	DATA_TYPE tmp = *i;
	*i = *j;
	*j = tmp;
}
void CheckCapacity(SeqList* seq)
{
	assert(seq);
	if (seq->_capacity == seq->_size)
	{
		DATA_TYPE* tmp;
		seq->_capacity = MAX_CAPACITY;
		//法一
		//seq->_array =(DATA_TYPE*)realloc(seq->_array, sizeof(DATA_TYPE)*seq->_capacity);
		//法二
		tmp = (DATA_TYPE*)malloc((seq->_size + seq->_capacity)*sizeof(DATA_TYPE));
		memcpy(tmp, seq->_array, sizeof(DATA_TYPE)*seq->_size);
		free(seq->_array);
		seq->_array = tmp;
	}
}
void InitSeqList(SeqList* seq)
{
	seq->_array = NULL;
	seq->_capacity = 0;
	seq->_size = 0;
}
void PrintSeqList(SeqList* seq)
{
	size_t  index = 0;
	assert(seq);
	for (; index < seq->_size; index++)
	{
		printf("%d ", seq->_array[index]);
	}
	printf("\n");
}
void PushBack(SeqList* seq, DATA_TYPE x)
{
	assert(seq);
	CheckCapacity(seq);
	seq->_array[seq->_size++] = x;
}
void PopBack(SeqList* seq)
{
	assert(seq);
	--seq->_size;
}
void PushFront(SeqList* seq, DATA_TYPE x)
{
	size_t index = seq->_size;
	assert(seq);
	CheckCapacity(seq);
	for (; index > 0; index--)
	{
		seq->_array[index] = seq->_array[index - 1];
	}
	seq->_array[0] = x;
	++seq->_size;
}
void PopFront(SeqList* seq)
{
	size_t index = 0;
	assert(seq);
	for (; index <seq->_size - 1; index++)
	{
		seq->_array[index] = seq->_array[index + 1];
	}
	--seq->_size;
}
void Insert(SeqList* seq, size_t pos, DATA_TYPE x)
{
	size_t index = 0;
	assert(seq);
	assert(pos <= seq->_size);
	CheckCapacity(seq);
	for (index = seq->_size; index > pos; index--)
	{
		seq->_array[index] = seq->_array[index - 1];
	}
	seq->_array[pos] = x;
	++seq->_size;
}
void RemoveAll(SeqList* seq, DATA_TYPE x)
{
	size_t begin = 0;
	size_t index = 0;
	size_t count = 0;
	for (; begin < seq->_size;)
	{
		if (seq->_array[begin] == x)
		{
			begin++;
			count++;
		}
		else
		{
			seq->_array[index++] = seq->_array[begin++];
		}
	}
	seq->_size -= count;
}
void Erase(SeqList* seq, size_t pos)
{
	size_t index = 0;
	assert(seq);
	assert(pos < seq->_size);
	for (index = pos; index<seq->_size - 1; index++)
	{
		seq->_array[index] = seq->_array[index + 1];
	}
	--seq->_size;
}
void BubbleSort(SeqList* seq)
{
	size_t i = 0;
	size_t j = 0;
	size_t tag = 0;
	for (i = 0; i < seq->_size - 1; i++)
	{
		tag = 0;
		for (j = 0; j < seq->_size - 1 - i; j++)
		{
			if (seq->_array[j]>seq->_array[j + 1])
			{
				Swap(&seq->_array[j], &seq->_array[j + 1]);
				tag = 1;
			}
		}
		if (tag == 0)
			break;
	}
}
void SelectSort(SeqList* seq)//选择排序:同时找两个,一个最大下标,一个最小下标
{
	int  begin = 0;
	int end = seq->_size - 1;
	size_t index = 0;
	size_t minIndex = 0;
	size_t maxIndex = 0;
	while (begin < end)
	{
		minIndex = begin;
		maxIndex = end;//对minIndex和maxIndex赋值
		for (index = begin; index < end + 1; index++)//for循环中,开区间,助于理解
		{
			if (seq->_array[minIndex]>seq->_array[index])
			{
				minIndex = index;
			}
			else if (seq->_array[maxIndex] < seq->_array[index])
			{
				maxIndex = index;
			}
		}
		if (minIndex != begin)
		{
			Swap(&seq->_array[minIndex], &seq->_array[begin]);
			if (maxIndex == begin)
				maxIndex = minIndex;
		}
		if (maxIndex != end)
		{
			Swap(&seq->_array[maxIndex], &seq->_array[end]);
		}
		begin++;
		end--;
	}
}
int  BinarySearch(SeqList* seq, DATA_TYPE x)
{
	size_t left = 0;
	size_t right = seq->_size - 1;
	size_t mid = 0;
	while (left <= right)//注意边界查找
	{
		mid = (left + right) / 2;
		if (seq->_array[mid] == x)
			return mid;
		else if (seq->_array[mid] > x)
			right = mid - 1;
		else if (seq->_array[mid] < x)
			left = mid + 1;
	}
	return -1;
}
void Test1()
{
	int ret = 0;
	SeqList  seq;
	InitSeqList(&seq);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushBack(&seq, 6);//尾插六次
	//PrintSeqList(&seq);
	//PopBack(&seq);
	//PrintSeqList(&seq);
	//PushFront(&seq,7);
	//PushFront(&seq, 8);
	//PushFront(&seq, 9);
	//PrintSeqList(&seq);
	//PopFront(&seq);
	//PrintSeqList(&seq);
	//Insert(&seq,1,10);
	//PrintSeqList(&seq);
	PushFront(&seq, 3);//插入7测试RemoveAll
	PushFront(&seq, 7);
	PushFront(&seq, 7);
	PushFront(&seq, 4);
	PushFront(&seq, 7);
	PushFront(&seq, 10);
	PushFront(&seq, 7);
	PushBack(&seq, 1);
	PrintSeqList(&seq);
	printf("%d\n", seq._size);
	RemoveAll(&seq, 7);
	PrintSeqList(&seq);
	//Erase(&seq,1);//删除pos位置的置
	//PrintSeqList(&seq);
	//BubbleSort(&seq);
	printf("%d\n", seq._size);
	SelectSort(&seq);
	PrintSeqList(&seq);
	/*ret = BinarySearch(&seq, 10);
	if (ret == -1)
	printf("未找到\n");
	else
	printf("10的下标为:%d\n", ret);*/
	free(seq->_array);
}
int main()
{
	Test1();
	system("pause");
	return 0;
}
时间: 2024-08-25 13:52:56

动态链表!!的相关文章

c语言:写一个函数建立一个有3名学生数据的单向动态链表

写一个函数建立一个有3名学生数据的单向动态链表. 解:程序: #include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student { long num; float score; struct Student *next; }; int n; struct Student *creat(void)//定义函数返回一个指向链表头的指针 { struct Student *head

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

C++ 动态链表

C++ 动态链表 用类写的 头文件代码: 1 #include<iostream> 2 #include<string> 3 //动态创建链表 4 using namespace std; 5 class LNode { 6 private: 7 string StudentNum; 8 string Name; 9 int age; 10 LNode *next; 11 public: 12 LNode() {}//构造函数 13 ~LNode() {}//析构函数 14 voi

静态链表和动态链表

1. 静态链表 结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为“引用自身的结构体”.如: struct link { char ch; struct link *p; } a; p是一个可以指向 struct link 类型变量的指针成员.因此,a.p = &a 是合法的表达式,由此构成的存储结构如图1所示. 图1 引用自身的结构体 例1 一个简单的链表 1 #include <stdio.h> 2 3 struct n

动态链表的建立

建立一个动态链表就是在程序执行时根据用户的输入从无到有一次建立起一个表格,这个表格中的数据都一次保存在各个节点上,每个节点都是用new操作符来动态开辟,节点与节点之间用指针next相关联 代码示例 1 #include <iostream> 2 using namespace std; 3 /*******************define class book************************/ 4 class book 5 { 6 public: 7 int num; 8

vc++基础班[28]---动态数组及动态链表的讲解

C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray.CList.CMap 会更方便一些! CArray.CList.CMap 的由来?…… ①.数组的基本说明: 数组是固定大小的,相同数据类型的元素的顺序集合,每个元素在数组中有一个固定的位置. 将10个数放入数组中,假设数组的名称为number,可以称数组中第一个元素为 number[0],第二个

C 动态链表的建立,输出,删除,插入

动态链表的建立,输出,删除,插入 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct student*next; }; int n;/*n为全局变量*/ struct student *creat() { struct

学习C/C++语言:结构体,动态链表

//*************************************************************** //结构体:简单的静态链表 #include<stdio.h> #include<string.h> #define NULL 0 #define SIZE 10 struct student { char num[SIZE]; float score; struct student *next; }; void main() { struct stu

通过结构体,建立动态链表,并输出链表

/***************** * 通过结构体,建立动态链表,并输出链表. * *******************/ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define LEN sizeof(struct student)  //宏定义 将LEN 替换为student 结构体的大小数值 struct student *create();  //声明创建新链表(节点)(结构体)函数,返回

01--数据结构——动态链表(C++)

数据结构——动态链表(C++) 定义一个节点: [cpp] view plain copy print? #include <iostream> using namespace std; typedef int T; struct Node{ T data; Node* next; Node(const T& d):data(d), next(NULL){} operator T(){ return data; } }; int main(){ Node a(10), b(20); c