practical of programming 第二章 可增长数组

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

typedef struct Nameval Nameval;
struct Nameval{
char *name;
int value;
};

struct NVtab{
int nval;   /* current number of values */
int max;    /* allocated number of values */
Nameval *nameval;  /* array of name-value pairs */
}nvtab;
/* NVINIT表示初始分配空间,NVGROW表示每次增加的空间倍数 */
enum {NVINIT = 1, NVGROW = 2};

/* addname: add new name and value to nvtab */
int addname(Nameval newname){
Nameval *nvp;
if (nvtab.nameval == NULL){/* first time 分配NVINIT个元素的空间*/
nvtab.nameval =
(Nameval *)malloc(NVINIT * sizeof(Nameval));
if (nvtab.nameval == NULL)
return -1;
nvtab.max = NVINIT;
nvtab.nval = 0;
}else if (nvtab.nval>=nvtab.max){/* 如果当前数量小于总数量,需要增加空间 */
nvp = (Nameval *)realloc(nvtab.nameval, /* realloc可自动复制原有的数据到新地址,如果原地址长度不够的话 */
(NVGROW*nvtab.max)*sizeof(Nameval));
if (nvp == NULL)
return -1;
nvtab.max *=NVGROW;
nvtab.nameval = nvp;
}
nvtab.nameval[nvtab.nval] = newname;
return nvtab.nval++;
}

/* 删除指定元素,并将后面的元素顺序前移 */
/* 定义函数: void *memmove(void *dest, const void *src, size_t n);
函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存 区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。
返回值: 返回指向dest的指针。
附加说明: 指针src和dest所指的内存区域可以重叠。 */
int delname(char *name){
int i;
for (i = 0; i< nvtab.nval; i++)/* 遍历所有元素 */
if (strcmp(nvtab.nameval[i].name,name)==0){/* match */
memmove(nvtab.nameval+i,nvtab.nameval+i+1,
(nvtab.nval-(i+1))*sizeof(Nameval));
nvtab.nval--;
return 1;
}
return 0;
}

int main()
{
Nameval n1 = {"steve", 01};
Nameval n2 = {"bill", 02};
Nameval n3 = {"sylar", 03};
addname(n1);
addname(n2);
addname(n3);
printf("the 1st name is: %s and there are %d elements now, the max space is %d.\n",
nvtab.nameval[0].name,nvtab.nval,nvtab.max);
delname("steve");
printf("the 1st name is: %s and there are %d elements now, the max space is %d.\n",
nvtab.nameval[0].name,nvtab.nval,nvtab.max);
return 0;
}

posted @ 2010-02-25 06:39  莫忆往西  阅读(145)  评论(0)    收藏  举报