线性表实现代码笔记(C)

线性表实现代码笔记(C)

在C语言中,一维数组的元素也是存放于一片连续的存储空间中,故可借助于C语言中
一-维数组类型来描述线性表的顺序存储结构,即

功能:

		➢[1] push_back			➢[2]  push_fornt			
		➢[3] show_list			➢[4]  pop_back			
		➢[5] pop_font			➢[6]  insert_pos			
		➢[7] find				➢[8]  length				
		➢[9] delete_pos			➢[10] delete_val			;
		➢[11] sort				➢[12] resver_list	
		➢[13] clear				➢[14] destroy(程序结束)	
		➢[0]  quit_system	
#define _CRT_SECURE_NO_WARNINGS


#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include<iostream>

#define INC_SIZE 3
#define SEQLIST_INIT_SIZE 8

typedef int ElemType;

typedef	struct  SeqList {
	ElemType *base; //指向真实所开辟的空间
	int capacity;	//容量
	int size;		//大小 相当于有效个数

}SeqList;
 
bool Inc(SeqList * Mylist);
void show();
void InitSeqList(SeqList *mylist);
void push_back(SeqList *mylist, ElemType x);//尾部插入 ElemType x为数据
void push_fornt(SeqList *mylist, ElemType x);//头部插入
void show_list(SeqList * Mylist);
void pop_back(SeqList * Mylist); //尾删
void pop_font(SeqList * Mylist);//头删
void insert_pos(SeqList * Mylist, int pos, ElemType x);//按位置插入
int findfind_List(SeqList * Mylist, ElemType key);
int length(SeqList * Mylist);
void delete_pos(SeqList * Mylist,int pos);
void delete_val(SeqList * Mylist, ElemType key);
void sort(SeqList * Mylist);
void resver_list(SeqList * Mylist);
void clear(SeqList * Mylist);
void destory(SeqList * Mylist);
void main() {
	ElemType Item;
	SeqList mylist; 
	InitSeqList(&mylist);

	int pos;
	int select = 1;
	while (select)
	{
	
		printf("*  [1] push_back		[2]  push_fornt			 *\n");
		printf("*  [3] show_list		[4]  pop_back			 *\n");
		printf("*  [5] pop_font			[6]  insert_pos			 *\n");
		printf("*  [7] find				[8]  length				 *\n");
		printf("*  [9] delete_pos		[10] delete_val			 *\n");
		printf("*  [11] sort			[12] resver_list		 *\n");
		printf("*  [13] clear			[14] destroy(程序结束)	 *\n");
		printf("*  [0]  quit_system	 *\n");
		
		printf("请选择:");
		scanf_s("%d", &select);

		if (select == 0) {
			break;
		}
		switch (select) {
		case 1:

			printf("请输入要插入的数据(-1结束):");
			printf("可输入多个数据:\n");
			while (scanf_s("%d", &Item), Item != -1) {
				push_back(&mylist, Item);
				
			}
			
			break;
		case 2:
			printf("请输入要插入的数据(-1结束):");
			printf("可输入多个数据:\n");
			while (scanf_s("%d", &Item), Item != -1) {
				push_fornt(&mylist, Item);
			}
			break;
		case 3:
			show_list(&mylist);
			break;
		case 4:
			pop_back(&mylist);
			break;
		case 5:
			pop_font(&mylist);
			break;
		case 6:
			printf("请输入要插入的数据:>");
			scanf_s("%d", &Item);
			printf("请输入要插入的位置:");
			scanf_s("%d", &pos);


			insert_pos(&mylist,pos,Item);
			break;
		case 7:
			printf("请输入要查找的数据:");
			scanf("%d", &Item);
			pos = findfind_List(&mylist, Item);
			if (pos == -1)
				printf("查找的数据%d在顺序表中不存在\n", Item);
			else
				printf("查找的数据%d在顺序表中的%d下标位置\n", Item, pos);
			break;
		case 8:
			printf("顺序表的长度为: %d\n", length(&mylist));
			break;
		case 9:
			printf("请输入要删除数据的位置:");
			scanf("%d", &pos);
			delete_pos(&mylist,pos);
			break;
		case 10:
			printf("请输入要删除的数据:");
			scanf("%d", &Item);
			delete_val(&mylist, Item);
			break;
		case 11:
			sort(&mylist);
			break;
		case 12:
			resver_list(&mylist);
			break;
		case 13:
			clear(&mylist);
			break;
			/*case 14:
				destory(&mylist);
				break;*/
		default:
			printf("输入有误!请重新输入!\n");
			break;
		}


	}
	destory(&mylist);

	system("pause");
}



//初始化
void InitSeqList(SeqList *list) {
	//动态分配内存
	list->base = (ElemType *)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
	assert(list->base != NULL); //判断空间开辟是否成功
	list->capacity = SEQLIST_INIT_SIZE;
	list->size = 0;

}

//尾部插入
void push_back(SeqList *mylist, ElemType x) {

	if (mylist->size >= mylist->capacity && !Inc(mylist)) {
		printf("顺序表空间已满,不能尾部插入数据.\n");
		return;
	}
	mylist->base[mylist->size] = x;
	
	mylist->size++;
}

//头部插入
void push_fornt(SeqList *mylist, ElemType x) {
	if (mylist->size >= mylist->capacity && !Inc(mylist)) {
		printf("顺序表空间已满,%d不能尾部插入数据.\n",x);
		return;
	}
	for (int i = mylist->size; i >0; i--) {
		mylist->base[i] = mylist->base[i-1];
	}
	mylist->base[0] = x;

	mylist->base[mylist->capacity] = x;

	mylist->size++;

}


void show_list(SeqList * Mylist) {
	int i;
	for ( i = 0; i < Mylist->size; i++) {
		printf("%d ", Mylist->base[i]);
	}

	printf("\n");
}

//尾部删除
void pop_back(SeqList * Mylist) {

	if (Mylist->size == 0) {
		printf("顺序表为空表,尾部不能删除数据!\n");
		return;
	}
	Mylist->size--;


}
//头部删除
void pop_font(SeqList * Mylist) {
	if (Mylist->size == 0) {
		printf("顺序表为空表,尾部不能删除数据!\n");
		return;
	}
	for (int i = 0; i < Mylist->size - 1; i++) {
		Mylist->base[i] = Mylist->base[i + 1];
	}

	Mylist->size--;

}

//按照位置插入数据
void insert_pos(SeqList * Mylist, int pos, ElemType x) {
	if (pos < 0 || pos > Mylist->size) {
		printf("插入数据的位置非法,不能插入数据.\n");
	}

	if (Mylist->size >= mylist->capacity && !Inc(mylist)) {
		printf("顺序表空间已满,%d不能按位置插入数据.\n", x);
		return;
	}
	/*if (pos == 0) {
		push_fornt(Mylist,x);
		}
		else if (pos == Mylist->size) {
		push_back(Mylist, x);
		}
		else  {*/
	for (int i = Mylist->size; i > pos; --i) {
		Mylist->base[i] = Mylist->base[i - 1];
	}
	Mylist->base[pos] = x;
	Mylist->size++;
	/*}*/

}

int findfind_List(SeqList * Mylist, ElemType key) {
	int i;
	for ( i = 0; i < Mylist->size; i++) {
		if (Mylist->base[i] == key) {
			return i;
		}

	}
	return -1;

}

int length(SeqList * Mylist) {
	return Mylist->size;

}

void delete_pos(SeqList * Mylist, int pos) {
	if (pos < 0 || pos >= Mylist->size) {
		printf("删除数据的位置非法,不能删除数据.\n");
	}

	for (int i = pos; i < Mylist->size-1; i++) {
		Mylist->base[i] = Mylist->base[i + 1];
	}
	Mylist->size--;

}

void delete_val(SeqList * Mylist, ElemType key) {

	int pos = findfind_List(Mylist, key);
	if (pos == -1) {
		printf("要删除的数据不存在");
		return;
	}

	delete_pos(Mylist, pos);


}

void sort(SeqList * Mylist) {
	int i, j, temp;
	/*for (i = 0; i < Mylist->size - 1; i++) {
		for (j = 0; j < Mylist->size - 1 - i; j++) {

		if (Mylist->base[j]>Mylist->base[j + 1]) {
		temp = Mylist->base[j];
		Mylist->base[j] = Mylist->base[j + 1];
		Mylist->base[j + 1] = temp;

		}

		}

		}*/

	for (i = 0; i < Mylist->size; i++) {
		for (j = i + 1; j < Mylist->size; j++) {

			if (Mylist->base[i]>Mylist->base[j]) {
				temp = Mylist->base[i];
				Mylist->base[i] = Mylist->base[j];
				Mylist->base[j] = temp;

			}

		}

	}





	show_list(Mylist);

}

void resver_list(SeqList * Mylist) {
	
	if (Mylist->size == 0 || Mylist->size == 1) {
		return;
	}
	
	int low = 0;
	int high = Mylist->size - 1;
	ElemType temp;

	while (low < high) {
		temp = Mylist->base[low];
		Mylist->base[low] = Mylist->base[high];
		Mylist->base[high] = temp;
		low++;
		high--;
	}
	return;


}

void clear(SeqList * Mylist) {

	Mylist->size = 0;

}
void destory(SeqList * Mylist) {

	free(Mylist->base);
	Mylist->base = NULL;
	Mylist->capacity = 0;
	Mylist->size = 0;
}

//重新对已有的空间开辟内存空间
bool Inc(SeqList * Mylist) {

	ElemType *newbase = (ElemType*)realloc(Mylist->base, sizeof(ElemType)*(Mylist->capacity + INC_SIZE));
	if (newbase ==NULL) {
		printf("增配空间失败,内存不足!");
		return false;
	}

	Mylist->base = newbase;
	Mylist->capacity += INC_SIZE;
	return false;

}

补充(2个线性表合并成一个有序的线性表)

//2个线性表合并
void merge(SeqList *la, SeqList * lb, SeqList *lt) {
	lt->capacity = la->size + la->size;
	lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);
	assert(lt->base != NULL);

	int ia = 0;
	int ib = 0;
	int ic = 0;
	while (ia <la->size && ib<lb->size) {
		if (la->base[ia] < lb->base[ib]) {
			lt->base[ic] = la->base[ia];
		}
		else {
			lt->base[ic++] = lb->base[ib++];
		}
	}

	while (ia<la->size) {
	
		lt->base[ic++] = la->base[ia++];
	}

	while (ib < lb->size) {

		lt->base[ic++] = lb->base[ib++];

	}
	lt->size = la->size + la->size;

}

猜你喜欢

转载自blog.csdn.net/qq_42481940/article/details/106912044