C语言用数组完成线性表得增删


//
//  main.c
//  02-用数组完成线性表得增删
//
//用数组的方式完成(有序)线性表特定元素的增加和删减
//
//  Created by wangju on 15/10/9.
//  Copyright © 2015年 wangju. All rights reserved.
//

#include <stdio.h>
#include<stdlib.h>

//预留内存空间
#define RESERVE 100
#define ERROR -1




void addElement(int);

//-1表示删除失败 1表示删除成功
int deleteElement(int);

//输出list的所有元素
void printList();
void initList();


//向新内存空间拷贝旧内存空间的数据,并释放旧内存空间
void ElementTransfer(int *,int *);

void ResetList();


struct list
{
    int* data;//指向数组的指针
    int length;//元素的长度
    int trueLength;//实际长度
}arrayList;


void addElement(int Element)
{
    int* oldData = NULL;
    if (arrayList.data == NULL)//当数据为空时长度重置为零
    {
        arrayList.length = 0;
        arrayList.trueLength = 0;
        
    }
    

    if (arrayList.length >= arrayList.trueLength)
    {
        arrayList.trueLength = arrayList.length + RESERVE;
      
        if(arrayList.data != NULL)
          oldData = arrayList.data;
  
        arrayList.data = (int *)malloc(sizeof(int) * arrayList.trueLength);
        if (arrayList.data == NULL) {
            return exit(-1);
        }
        
        
        ElementTransfer(arrayList.data,oldData);
    }
    
    arrayList.data[arrayList.length] = Element;
    
    arrayList.length++;
}

int deleteElement(int Element)
{

    if(arrayList.length == 0)
    {
        return -1;
    }

    for (int i = 0; i < arrayList.length; i ++) {
        if (arrayList.data[i] == Element)
        {
            
            for (int j = i; j < arrayList.length - 1; j++)
            {
                arrayList.data[j] = arrayList.data[j+1];
            }
            arrayList.length--;
            return 1;
            
        }
    }
    
    return -1;
    
}


void ElementTransfer(int* newData,int* oldData)
{

    if (oldData == NULL)
    {
        return;
    }
    
    for (int i = 0; i < arrayList.length; i++)
    {
       newData[i]= oldData[i];
    }

    free(oldData);
}
void initList()
{
    arrayList.data = NULL;
    arrayList.length = 0;
    arrayList.trueLength = 0;
}

void printList()
{
    
    for (int i = 0; i < arrayList.length; i++)
    {
        printf("%5d",arrayList.data[i]);
    }
    printf("\n");
    
}

void ResetList()
{
    free(arrayList.data);
    arrayList.data = NULL;
    arrayList.length = 0;
    arrayList.trueLength = 0;
}



int main(int argc, const char * argv[])
{

    
    
    initList();
    
    for (int i =0; i < 150; i++)
    {
        addElement(i);
    }
    
    
    
    printList();
    
    printf("------------------华丽的分割线-----------------------\n");
    
    deleteElement(40);
    deleteElement(0);
    deleteElement(149);
    addElement(999);
    
    printList();
    
    
    
    return 0;
}


思路:

构造一个c语言 结构体

struct list
{
    int* data;//指向数组的指针
    int length;//元素的长度
    int trueLength;//实际长度
}arrayList;

用data保存数组指针,通过动态内存分配的方法。


为了避免频繁分配空间,设置一个预留空间

当预留满了的时候分配新空间

实现代码



    if (arrayList.length >= arrayList.trueLength)
    {
        arrayList.trueLength = arrayList.length + RESERVE;
      
        if(arrayList.data != NULL)
          oldData = arrayList.data;
  
        arrayList.data = (int *)malloc(sizeof(int) * arrayList.trueLength);
        if (arrayList.data == NULL) {
            return exit(-1);
        }
        
        
        ElementTransfer(arrayList.data,oldData);
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值