C语言笔记--3数据类型的经典应用--2指针(动态)

创建动态的线性链表(数组)+ 中间(n, n+1)插入数据value,删除第n个数据其实指针真正的用处就用在动态的存储数据上面。以此来解决内存优化的问题。

这里使用数据的形式,先写一下顺序表中的指针的使用方法:

目录

链表LA+LB-->LA

arr1+arr2-->arr3

创建动态线性链表

动态的线性链表(数组)--增+删



链表LA+LB-->LA

其中LA中已有的数据LB就不要加紧来了

// 将arr1中有而arr2中没有的数据插入到arr2中(尾部直插)
void test01(char* arr1, char* arr2) {
	int len = strlen(arr2);
	char *p, *flag;
	p = arr1;
	printf("%s\n",arr2);
	while( *p != '\0'){
		flag = strchr(arr2, *p);
		if(!flag) arr2[len++] =  *p;
		p++;		
	}
	printf("%s\n",arr2);
}

arr1+arr2-->arr3

将arr1+arr2由大到小排序,然后将arr1+arr2合并为arr3中,使其仍然由大到小排序

// 将arr1+arr2由大到小排序,然后将arr1+arr2合并为arr3中,使其仍然由大到小排序
void test02(char* arr1, char* arr2) {
	void test02_SelectSort(char* arr1);
	void test02_QuickSort(char* arr1, int left, int right);
	
	char *p1, *p2, *p3;

	printf("%s,%s\n", str1, str2);				// arr1+arr2由大到小排序
	test02_SelectSort(str1);
	test02_QuickSort(str2, 0, 10);
	printf("%s,%s\n", str1, str2);

	p1 = str1, p2 = str2, p3 = str3;
	while((*p1 != '\0') && (*p2 != '\0')) {		// 将arr1+arr2合并为arr3中,使其仍然由大到小排序
		if(*p1 < *p2) {
			*p3 = *p2;
			p2++;
		}
		else{
			*p3 = *p1;
			p1++;
		}
		p3++;
	}
	while(*p1 != '\0') {
		*p3 = *p1;
		p1++;
		p3++;
	}
	while(*p2 != '\0') {
		*p3 = *p2;
		p2++;
		p3++;
	}
	printf("%s\n", str3);
}
void test02_QuickSort(char* arr1, int left, int right) {
	char *scan, *address, *move;
	char ch;
	if(left < right) {
		address = scan = arr1 + left;
		ch = *address;
		for(; scan < arr1 + right; scan++) {
			printf("%c,%c\n",*address, *scan);
			if(*address <  *scan) {
				*address = *scan;
				for(move = scan; move > address; move--) *move = *(move - 1);
				address ++, *address = ch;
				printf("%s\n",arr1);
			}	
		}
		test02_QuickSort(arr1, address - arr1 + 1, right);
		test02_QuickSort(arr1, left, address - arr1);
	}
}
void test02_SelectSort(char* arr1) {
	char * p1, * p2;
	int temp;
	for(p1 = arr1; *p1 != '\0'; p1++) 
		for(p2 = p1; *p2 != '\0'; p2++) 
			if( *p1 < *p2) {
				temp = *p1, *p1 = *p2, *p2 = temp;
			}
				
}

创建动态线性链表

// 创建动态的线性链表(数组)+ 初始化
void test03() {
	int i;
	SqList *InitList_Sq (SqList L);
	SqList arr;
	arr.length = 0;
	arr.listsize = LIST_INIT_SIZE;
	arr = *InitList_Sq (arr);
	for( i = 0; i < LIST_INIT_SIZE / 2; i++) {
		arr.Elem[i] = START + i;
		arr.length++;
		printf("%c\t", arr.Elem[i]);
	}
}
SqList *InitList_Sq (SqList L) {
	L.Elem = (char *)malloc(L.listsize * sizeof(L.length));
	if(!L.Elem) exit(0);
	return &L;
}

动态的线性链表(数组)--增+删

// 创建动态的线性链表(数组)+ 中间(n, n+1)插入数据value,删除第n个数据
void test04() {
	SqList *InitList_Sq (SqList L);
	SqList *ListDelete_Sq (SqList L, int n);
	SqList *ListInsert_Sq (SqList L, int n, int value);
	SqList arr;
	
	arr.length = 0;
	arr.listsize = LIST_INIT_SIZE;
	arr = *InitList_Sq (arr);
	for( move = 0; move < LIST_INIT_SIZE; move++ ) {
		arr.Elem[move] = START + move;
		arr.length++;
	}
	printf("增加完数据:%d,%d\n", arr.length, arr.listsize);
	printf("%s,%d,%d\n", arr, arr.length, arr.listsize);
	arr = *ListInsert_Sq (arr, MID, TEMP_VALUE);
	printf("%s,%d,%d\n", arr, arr.length, arr.listsize);
	arr = *ListDelete_Sq (arr, MID);
	printf("%s,%d,%d\n", arr, arr.length, arr.listsize);
}
SqList *ListDelete_Sq (SqList L, int n) { 
	if( n < 1 || n > L.length) 	return ERROR;
	for(move = n - 1; move < L.length; move++) 
		L.Elem[move] = L.Elem[move + 1];		
	L.length --;
	return &L;
}
SqList *ListInsert_Sq (SqList L, int n, int value) { 
	char *newbase;
	if( n < 1 || n > L.length) 	return ERROR;
	if(L.length >= L.listsize) {
		L.listsize = L.listsize + LISTINCREMENT;
		newbase = (char *)realloc(L.Elem, (L.listsize + LISTINCREMENT) * sizeof(char));
		if(!newbase) exit(0);
		L.Elem = newbase;
	}
	for(move = L.length; move > n - 1; move--) 
		L.Elem[move] = L.Elem[move - 1];
	L.length ++;
	L.Elem[move] = value;
	return &L;
}

 


返回:C语言笔记--数据类型(总)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值