C语言知识补习

打算画个一两天补下C里面不熟的内容

学习参考:
【1】【C语言】C语言程序设计.浙江大学.翁恺
【2】RUNOOB.COM

学习内容:

  1. 解释/编译
  2. 枚举类型 enum
  3. 定义常量 #define const
  4. 存储类
    auto register static 使用
    static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰全局变量时,变量的作用域限制在声明它的文件内。
    静态本地变量:函数离开时,继续保持并存在;具有全局的生存期 ,本地的作用域
    extern
  5. 字符串:使用 null 字符 ‘\0’ 终止的一维字符数组
  6. 共用体union:任何时候只能有一个成员带有值
  7. 可变参数
  8. 可变数组
#include<stdio.h>
#include<stdlib.h>

#ifndef _ARRAY_H_
#define _ARRAY_H_

#define BLOCK_SIZE 20
typedef struct {
	int *array;
	int size;
	}Array;
	
Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a,int index);
void array_inflate(Array *a, int more_size);
#endif


Array array_create(int init_size){
	Array a;
	a.array = (int *)malloc(sizeof(int)* init_size);
	a.size = init_size;		
	return a;
	}
	
void array_free(Array *a){
	free(a->array);
	a_array = NULL;
	a->size = 0;
	}
	
//封装
int array_size(const Array *a){
	return a->size;
	}
	
int* array_at(Array *a,int index){
	if(index >= a->size){
		array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE- a->size);
		}
	return &(a->array[index]);
	}

int array_get(const Array *a, int index){
	retur a->array[index];
	}	
	
void array_set(Array* a, int index, int value){
	a->array[index] = value;
	}
	 
void array_inflate(Array *a, int more_size){
	int *p = (int*)malloc(sizeof(int)*(a->size+more_size));
	memcpy(p,a->array,a->size);
	free(a->array);
	a->array = p;
	a->size += more_size;
	}

int main(){
	Array a = array_create(100);
	printf("%d\n",__func__,array_size(&a));
	
	*array_at(&a, 0) = 10;
	printf("%d\n",__func__,*array_at(&a, 0));
	array_free(&a);
	
	int number, cnt =0;
	while(number!=-1){
		scanf("%d",&number);
		if(number!=-1){
			*array_at(&a, cnt++)=number;
			}
		}
	
	return 0;
	}
  1. 链表
#include<stdio.h>
#include<stdlib.h>


#ifndef _NODE_H_
#define _NODE_H_

typedef struct _node{
	int value;
	struct _node *next;
}Node;
	
typedef struct _list{
	Node* head;
	Node* tail;
}List;

void add(Node** pHead, int number);
void print(List *plist);

#endif


int main(){
	int number;
	List list;
	list.head = NULL;
	list.tail = NULL;
	do{
		scanf("%d", &number);
		if(number != -1){
			//add to linked-list
			head = add(&list, number);
			}
	}while(number != -1);
		
	//遍历
	print(&list);
	
	//删除
	int isFound = 0;
	scanf("%d", &number);
	Node * p;
	Node * q;//指向p前一个	
	for(q=NULL, p = plist->head; p ; q=p, p=p->next){
		if(p->value ==number){
			if(q){
				q->next = p->next;
			}else{
				list->head = p->next;//**boundary
			}
			free(p);
			break;
		}	
	}

	//清除
	for(p = plist->head; p ; p=q){
		 q=p->next;
		 free(p);
	}
	
	return 0;
}
void print(List *plist){
	Node * p ;
	for(p = plist->head; p ; p=p->next){
		printf("%d", p->value);
	}
	printf("\n");
	
}
void add(List* pList, int number){
	if(pList->head){
		pList->head = p;
	}else{
		Node * p =(Node*)malloc(sizeof(Node));
		p->value = number;
		p->next = NULL;
		pList->tail->next = p;
		pList->tail = pList->tail->next;
		}
}

  1. __func__表示当前函数的名字
发布了20 篇原创文章 · 获赞 6 · 访问量 4629

猜你喜欢

转载自blog.csdn.net/better_eleven/article/details/104749657