C语言实现数组功能

array.h 文件

typedef struct {
	int len;
	int num;
	int *head;
} A;

void init_array(A *a, int len); /* 初始化数组 */
bool array_push(A *a, int value); /* 将元素推到数组末尾, */
bool is_full(A *a); /* 数组是否已满 */
void traverse_array(A *a); /* 遍历数组 */
void inverse_array(A *a); /* 翻转数组 */
int array_pop(A *a); /* 删除最后一个元素,返回被删除的元素 */
void array_insert(A *a, int index, int value); /* 插入元素 */

array.c 文件

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <stdlib.h>
#include "array.h"


int main()
{
	A a;
	int len;
	int num = 0;
	int value;

	printf("请输入数组的长度:");
	scanf("%d", &len);

	init_array(&a, len);
	printf("\n请输入数组的值: ");
	while (scanf("%d", &value) == 1 && num < len) {
        if (array_push(&a, value)) {
            printf("成功添加%d\n", value);
        } else {
            printf("%d添加失败\n", value);
        }
        num++;
	}

	traverse_array(&a); /* 遍历数组 */
	inverse_array(&a); /* 翻转数组 */
	traverse_array(&a); /* 重新遍历数组 */
	array_pop(&a); /* 删除末尾一个元素 */
	array_pop(&a); /* 删除末尾一个元素 */
	traverse_array(&a);
	array_insert(&a, 0, 111); /* 首位插入新元素111 */
	traverse_array(&a);
    array_insert(&a, 3, 333); /* 试一下插入一个错误的值 */
	traverse_array(&a);
	return 0;
}

void init_array(A *a, int len)
{
	if (len <= 0) {
		return ;
	}

	a->head = (int *)malloc(sizeof(int) * len);
	if (a->head == NULL) {
		printf("创建内存失败\n");
		exit(-1);
	}
	a->len = len;
	a->num = 0;
}

bool array_push(A *a, int value)
{
	if (is_full(a)) {
		printf ("当前数组已满,%d插入失败\n", value);
		return false;
	}

	a->head[a->num] = value;
	a->num++;
	return true;
}

bool is_full(A *a)
{
	if (a->num == a->len) {
		return true;
	} else {
		return false;
	}
}

bool is_empty(A *a)
{
	if (a->num == 0) {
		return true;
	} else {
		return false;
	}
}

void traverse_array(A *a)
{
	if (is_empty(a)) {
		printf("当前数组为空\n");
		exit(-1);
	}

	printf("\n当前数组内容为:\n");
	int i;
	for (i = 0; i < a->num; i++) {
		printf("%i ", a->head[i]);
	}
	printf("\n");
}

void inverse_array(A *a)
{
    if (is_empty(a)) {
        printf("当前数组为空\n");
        exit(-1);
    }

    int end = a->num - 1;
    int start = 0;
    int temp;
    while (start < end) {
        temp = a->head[start];
        a->head[start] = a->head[end];
        a->head[end] = temp;
        start++;
        end--;
    }
}

int array_pop(A *a)
{
    if (is_empty(a)) {
        printf("当前数组为空\n");
        exit(-1);
    }

    a->num--; /* TODO 并没有真正的删除 */
    return a->head[a->num];
}

void array_insert(A *a, int index, int value)
{
    if (is_full(a)) {
        printf("当前数组已满\n");
        exit(-1);
    }

    if (index + 1 > a->len || index < 0) {
        printf("插入位置超过了数组最大长度\n");
        exit(-1);
    }

    if (a->head[index]) {
        int temp;
        int i;
        for (i = a->num; i > index; i--) {
            a->head[i] = a->head[i-1];
        }
    }
    a->head[index] = value;
    a->num++;
}


转载于:https://my.oschina.net/wuzhencan/blog/888503

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以通过使用STL容器来实现数组去重的功能。STL(Standard Template Library)是C++标准库的一部分,提供了一系列的容器和算法,方便开发者进行数据结构和算法的实现。 在C语言中,可以使用哈希表来实现数组去重。哈希表是一种以键值对形式存储数据的数据结构,通过将元素的值映射到一个唯一的索引位置来实现快速的查找和插入操作。 以下是使用哈希表实现数组去重的步骤: 1. 创建一个空的哈希表。 2. 遍历原始数组中的每个元素。 3. 对于每个元素,检查哈希表中是否已经存在该元素。 - 如果存在,则说明该元素已经出现过,不需要再次插入到结果数组中。 - 如果不存在,则将该元素插入到哈希表中,并将该元素添加到结果数组中。 4. 返回结果数组,即为去重后的数组。 下面是一个示例代码: ```c #include <stdio.h> #include <stdbool.h> #define HASH_SIZE 100 typedef struct Node { int value; struct Node* next; } Node; typedef struct HashTable { Node* buckets[HASH_SIZE]; } HashTable; void initHashTable(HashTable* hashTable) { for (int i = 0; i < HASH_SIZE; i++) { hashTable->buckets[i] = NULL; } } int hash(int value) { return value % HASH_SIZE; } bool contains(HashTable* hashTable, int value) { int index = hash(value); Node* node = hashTable->buckets[index]; while (node != NULL) { if (node->value == value) { return true; } node = node->next; } return false; } void insert(HashTable* hashTable, int value) { int index = hash(value); Node* newNode = (Node*)malloc(sizeof(Node)); newNode->value = value; newNode->next = hashTable->buckets[index]; hashTable->buckets[index] = newNode; } void removeDuplicates(int* arr, int size) { HashTable hashTable; initHashTable(&hashTable); int result[size]; int resultSize = 0; for (int i = 0; i < size; i++) { if (!contains(&hashTable, arr[i])) { insert(&hashTable, arr[i]); result[resultSize++] = arr[i]; } } printf("去重后的数组:"); for (int i = 0; i < resultSize; i++) { printf("%d ", result[i]); } printf("\n"); } int main() { int arr[] = {1, 2, 3, 4, 2, 3, 5}; int size = sizeof(arr) / sizeof(arr); removeDuplicates(arr, size); return 0; } ``` 运行以上代码,输出结果为:去重后的数组:1 2 3 4 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值