//Stack.h #ifndef STACK_H #define STACK_H typedef struct Stack{ void* elems; int logical_len; int alloc_len; int elem_size; void (*freefn)(void*);//function pointer is responsible for freeing the content s->elems[i] points }stack; void StackNew(stack* s,int elem_size); void StackNew_2(stack* s,int elem_size,void (*free)(void*));//add specific free function in struct void StackDispose(stack* s); void StackDispose_2(stack* s);//use StringFree function to free *(char**) void StackPush(stack* s,void* elem_addr); void* StackPop(stack* s,void* elem_addr); void StringFree(void *elem); #endif //Stack.cc #include<stdlib.h> #include<assert.h> #include<string.h> #include"Stack.h" void StringFree(void *elem){ free(*(char**)elem); } void StackNew(stack *s,int elem_size){ s->logical_len=0; s->alloc_len=4; s->elem_size=elem_size; s->elems=malloc(4*s->elem_size); assert(s->elems!=NULL); } void StackNew_2(stack *s,int elem_size,void (*freefn)(void*)){ s->logical_len=0; s->alloc_len=4; s->elem_size=elem_size; s->elems=malloc(4*s->elem_size); s->freefn=freefn; assert(s->elems!=NULL); } void StackDispose(stack *s){ free(s->elems); } void StackDispose_2(stack *s){ if(s->freefn!=NULL){ for(int i=0;i<s->logical_len;i++){ s->freefn((char*)s->elems+i*s->elem_size); } } free(s->elems); } void StackPush(stack *s,void* elem_addr) { if(s->logical_len==s->alloc_len){ s->alloc_len*=2; s->elems = (int*)realloc(s->elems,s->alloc_len*s->elem_size); assert(s->elems!=NULL); } void* location = (char*)s->elems + s->logical_len*s->elem_size; memcpy(location,elem_addr,s->elem_size); s->logical_len++; } void* StackPop(stack *s,void* elem_addr){ assert(s->logical_len>0); void* location = (char*)s->elems + (s->logical_len-1)*s->elem_size; memcpy(elem_addr,location,s->elem_size); s->logical_len--; return elem_addr; } //lesson7.cc #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include"Stack.h" using namespace std; void Rotate(void* front, void* middle, void* end){ int front_size = (char*)middle - (char*)front;//if the two operators are int type, the result is not the bytes between them but the number of ints between them,so we need cast void* into char* which results the bytes we need. int back_size = (char*)end - (char*)middle+1; char buffer[front_size]; memcpy(buffer,front,front_size); memcpy(front,middle,back_size); memcpy((char*)front+back_size,buffer,front_size); } void qsort(void* base, int size, int elem_size, void (*cmpfn)(void*,void*)){ //not been finished in this lesson 7. } void lesson7(){ cout<<"lesson7"<<endl; Stack string_stack; //fill Stack with "friends" const char* friends[]={"AI","Bob","Carl"}; StackNew_2(&string_stack,sizeof(char*),StringFree); for(int i=0;i<3;i++){ char *copy = strdup(friends[i]); StackPush(&string_stack,©); } //print "friends"'s name char* name; for(int i=0;i<3;i++){ StackPop(&string_stack,&name); printf("%s/n",name); free(name); } StackDispose(&string_stack); char string[6]={'a','b','c','d','e','f'}; Rotate(&string[0],&string[4],&string[5]); for(int i=0;i<6;i++){ printf("%c ",string[i]); } }