线性表主函数+扩容

线性表主函数

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
typedef struct vector {
    int* data;
    int size;
    int len;
}Vec;
int insert(Vec *v,int idx,int val) {
    if (!v)  return 0;
    if (idx<0||idx>v->len )return 0;
    if (v->len == v->size)return 0;
    memcpy(v->data +idx+1,v->data +idx,sizeof(int)*(v->len -idx));
    v->data[idx] = val;
    v->len++;
    return 1;
}
int erase(Vec*v,int idx) {
    if (!v)return 0;
    if (idx < 0 || idx >= v->len)return 0;
    memcpy(v->data +idx,v->data+idx+1,sizeof(int)*(v->len-idx-1));
    v->len--;
}
Vec* initial(int n){
    Vec * v = (Vec*)malloc(sizeof(Vec)+1);
    v->data = (int*)malloc(sizeof(int) * n);
    v->size = n;
    v->len = 0;
   printf("init Vector sucessfully ,size is %d\n",v->size);
    return v;
}
void showVec(Vec* v) {
    if (!v)return;
    printf("Vec:[");
    int i;
    for (i = 0; i < v->len; i++) {
        i&& printf(",");
        printf("%d", v->data[i]);
    }
    printf(":]\n");
}
void freeVec(Vec* v) {
    if (v) {
        free(v->data);
        free(v);
        printf("free Vector sucessfully \n");
    }
    return;
}
int main(int argc, char* argv[]) {
    Vec* v = initial(10);
    srand(time(0));
    int cnt = 20;
    while (cnt--) {
        int val = rand() % 100;
        int op = rand() % 2;
        int idx = rand() % (v->len + 3) - 1;
        switch (op) {
        case 0:
        case 1:
        case 2:
            printf("insert %d at %d ,res =%d\n",val,idx, insert(v, idx, val)); 
               break;
        case 3:
            printf("erase at %d ,res =%d\n",  idx, erase(v, idx));
            break;
        }
        showVec(v);
    }
    freeVec(v);
    return 0;
}

线性表扩容

#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
typedef struct vector {
    int* data;
    int size;
    int len;
}Vec;
int expand(Vec* v);
int insert(Vec *v,int idx,int val) {
    if (!v)  return 0;
    if (idx<0||idx>v->len )return 0;
    if (v->len == v->size) {
        if (!expand(v)) {
            return 0;
        }
    }
    memcpy(v->data +idx+1,v->data +idx,sizeof(int)*(v->len -idx));
    v->data[idx] = val;
    v->len++;
    return 1;
}
int erase(Vec*v,int idx) {
    if (!v)return 0;
    if (idx < 0 || idx >= v->len)return 0;
    memcpy(v->data +idx,v->data+idx+1,sizeof(int)*(v->len-idx-1));
    v->len--;
}
Vec* initial(int n){
    Vec * v = (Vec*)malloc(sizeof(Vec)+1);
    v->data = (int*)malloc(sizeof(int) * n);
    v->size = n;
    v->len = 0;
   printf("init Vector sucessfully ,size is %d\n",v->size);
    return v;
}
void showVec(Vec* v) {
    if (!v)return;
    printf("Vec:[");
    int i;
    for (i = 0; i < v->len; i++) {
        i&& printf(",");
        printf("%d", v->data[i]);
    }
    printf("]\n");
}
void freeVec(Vec* v) {
    if (v) {
        free(v->data);
        free(v);
        printf("free Vector sucessfully \n");
    }
    return;
}
int expand(Vec*v) {
    if (!v)return 0;
    int expsize = v->size;
    int* tmp = &(v->size);
    while (expsize) {
        tmp = (int*)realloc(v->data,sizeof(int)*(v->size +expsize));
        if (tmp)break;
        expsize >>= 2;
    }
    if (!tmp) {
        printf("expend failed~\n");
        return 0;
    }
    v->data = tmp;
    v->size += expsize;
    printf("expand sucessfully~\n");
    return 1;
}
int main(int argc, char* argv[]) {
    Vec* v = initial(1);
    srand(time(0));
    int cnt = 20;
    while (cnt--) {
        int val = rand() % 100;
        int op = rand() % 2;
        int idx = rand() % (v->len + 3) - 1;
        switch (op) {
        case 0:
        case 1:
        case 2:
            printf("insert %d at %d ,res =%d\n",val,idx, insert(v, idx, val)); 
               break;
        case 3:
            printf("erase at %d ,res =%d\n",  idx, erase(v, idx));
            break;
        }
        showVec(v);
    }
    freeVec(v);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个完整版的线性表代码,包括顺序表和链表两种实现方式: 1. 顺序表实现: ```c #define MaxSize 100 // 定义线性表的最大长度 typedef struct { int data[MaxSize]; // 存储线性表元素的数组 int length; // 线性表的当前长度 } SqList; // 顺序表类型定义 // 初始化线性表 void InitList(SqList &L) { for (int i = 0; i < MaxSize; i++) { L.data[i] = 0; // 将所有元素初始化为0 } L.length = 0; // 线性表长度初始化为0 } // 插入元素 bool ListInsert(SqList &L, int i, int e) { if (i < 1 || i > L.length + 1) { // 判断插入位置是否合法 return false; } if (L.length >= MaxSize) { // 判断线性表是否已满 return false; } for (int j = L.length; j >= i; j--) { // 将插入位置后的元素依次后移 L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; // 将新元素插入到指定位置 L.length++; // 线性表长度加1 return true; } // 删除元素 bool ListDelete(SqList &L, int i, int &e) { if (i < 1 || i > L.length) { // 判断删除位置是否合法 return false; } e = L.data[i - 1]; // 将被删除的元素赋值给e for (int j = i; j < L.length; j++) { // 将删除位置后的元素依次前移 L.data[j - 1] = L.data[j]; } L.length--; // 线性表长度减1 return true; } // 查找元素 int LocateElem(SqList L, int e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) { return i + 1; // 返回元素在线性表中的位置 } } return 0; // 没有找到返回0 } ``` 2. 链表实现: ```c typedef struct Node { int data; // 存储数据元素 struct Node *next; // 存储下一个节点的指针 } LNode, *LinkList; // 链表节点类型定义和链表类型定义 // 初始化链表 void InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); // 创建头节点 L->next = NULL; // 头节点的指针域初始化为NULL } // 插入元素 bool ListInsert(LinkList &L, int i, int e) { LinkList p = L, s; // p指向头节点,s为新节点 int j = 0; while (p && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p || j > i - 1) { // 判断插入位置是否合法 return false; } s = (LinkList)malloc(sizeof(LNode)); // 创建新节点 s->data = e; // 将新元素赋值给新节点 s->next = p->next; // 将新节点插入到第i个节点之后 p->next = s; return true; } // 删除元素 bool ListDelete(LinkList &L, int i, int &e) { LinkList p = L, q; // p指向头节点,q为待删除节点 int j = 0; while (p->next && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p->next || j > i - 1) { // 判断删除位置是否合法 return false; } q = p->next; // 将待删除节点赋值给q e = q->data; // 将待删除节点的元素赋值给e p->next = q->next; // 将待删除节点从链表中删除 free(q); // 释放待删除节点的内存空间 return true; } // 查找元素 int LocateElem(LinkList L, int e) { LinkList p = L->next; // p指向第一个节点 int i = 1; while (p) { // 遍历链表 if (p->data == e) { return i; // 返回元素在链表中的位置 } p = p->next; i++; } return 0; // 没有找到返回0 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值