intmain() { srand(time(0));//按照时间取随机数,需要导入<time.h> #define MAX_OP 20 //定义一个最大选项的宏 Vector *vec=init(1);//初始化顺序表 int op,ind,val; for(int i=0;i<=MAX_OP;i++){ op=rand()%2;//随机产生0或1 ind=rand()%(vec->length+1); val=rand()%100;//随机产生1到100的数 switch(op){ case0:{ printf("inset %d at %d to vector\n",val,ind); insert(vec,ind,val); }break; case1:{ printf("erase item %d from vector\n",ind); erase(vec,ind); }break; } output(vec);//每进行一次操作之后输出一次数表 } return0; }
运行结果:
(4)关于realloc函数
a. realloc函数先尝试在原来的数表后面去扩展空间 ,如果成功,则返回原来的首地址(记为p)
b. 如果原有数表之后无法再继续扩充,realloc函数会调用malloc函数,真正地去重新分配空间,然后把原来空间中的数据拷贝到新的空间,最后再返回新申请空间的首地址 (p’)
c. malloc申请新的空间并完成拷贝之后会自动释放原来p的空间
d. 如果申请p’的步骤都失败了,realloc不会释放原来的空间,会返回一个空地址(无法找到原来地址,会造成内存泄漏)
e. 上述bug解决办法:
1 2 3 4 5 6
int new_size=vec->size*2; int *p=(int*)realloc(vec->data,sizeof(int)*new_size);//新建一个指针存储realloc的返回地址 if(p==NULL) return0; vec->size=new_size; vec->data=p; return1;
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> //定义链表结点 typedefstructListNode { //数据域 int data; //指向下一个结点的指针域 structListNode* next; }ListNode; //定义链表结构 typedefstructLinkList { //指向头结点的指针 ListNode head; //链表的总长度 int length; }LinkList; //初始化链表结点 ListNode* init_ListNode(int val) { //定义一个指针指向链表结点 ListNode* p = (ListNode*)malloc(sizeof(ListNode)); //给链表赋值 p->data = val; p->next = NULL; return p; } //初始化链表 LinkList* init_LinkList() { //定义一个指向链表的指针 LinkList* l = (LinkList*)malloc(sizeof(LinkList)); //初始化链表的头指针 l->head.next = NULL; //开始链表的总长度为0 l->length = 0; return l; } intinsert(LinkList* l, int ind, int val) { if (l == NULL)return0; if (ind<0 || ind>l->length)return0; ListNode* p = &(l->head), * node = init_ListNode(val); while (ind--) { p = p->next; } node->next = p->next; p->next = node; l->length += 1; return1; }
//销毁结点 voidclear_ListNode(ListNode* node) { if (node = NULL)return; free(node); return; } //销毁链表 结点 voidclear_LinkList(LinkList* l) { if (l == NULL) return; ListNode* p = l->head.next, * q; while (p) { q = p->next; clear_ListNode(p); p = q; } free(l); return; } //销毁链表 interase(LinkList* l,int ind) { if (l == NULL)return0; if (ind < 0|| ind >= l->length) return0; ListNode* p = &(l->head), * q; while (ind--) { p = p->next; } q = p->next->next; clear_ListNode(p->next); p->next = q; l->length -= 1; return1;
} voidoutput(LinkList* l) { printf("LinkList(%d)=", l->length); ListNode* i =l->head.next; for (i; i; i = i->next) { printf("%d -> ", i->data); } printf("NULL\n"); return; } #define MAX_OP 30 intmian() { LinkList* l = init_LinkList(); srand(time(0)); int i = 0; for (i = 0; i < MAX_OP; i++) { int op = rand() % 4; int ind = rand() % (l->length + 1); int val = rand() % 100;
switch (op) { case0: case1: case2: { printf("insert %d at %d to LinkList=%d", val, ind, insert(l, ind, val)); break; } case3: { printf("erase item at %d from LinkList=%d", ind, erase(l, ind)); break; } } output(l); printf("\n"); }