创建动态的线性链表(数组)+ 中间(n, n+1)插入数据value,删除第n个数据其实指针真正的用处就用在动态的存储数据上面。以此来解决内存优化的问题。
这里使用数据的形式,先写一下顺序表中的指针的使用方法:
目录
链表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;
}