数据结构顺序表与单链表

顺序表(顺序结构)

以下是对顺序表构建菜单的基本操作:初始化,输入,输出,插入,删除等。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define ERROR 0
#define ture 1
//创建顺序表
struct sqlist {
	int* elem;//声明动态数组
	int length;//记录表的当前长度
	int size;//记录表的分配容量
};
//初始化顺序表
sqlist Initlist(sqlist& L) {
	L.elem = (int*)malloc(maxsize * sizeof(int));//创建一个空的顺序表,动态申请存储空间
	if (!L.elem) //如果申请失败,做出提示并安全推出
	{
		printf("初始化失败");
			exit(0);
	}
	L.length = 0;//表的初始长度为0
	L.size = maxsize;//表的存储空间为maxsize
	return L;
}
//输入顺序表
sqlist creat_sqlist(sqlist& L) {
	printf("输入顺序表");
	int i = 0;
	scanf("%d", &L.elem[i]);
	while (L.elem[i] != 0) {
		i++;
		scanf_s("%d", &L.elem[i]);
	}
	L.length = i;
	return L;
}
//输出顺序表
sqlist print_sqlist(sqlist& L) {
	printf("存储的数据如下:\n");
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.elem[i]);
	printf("\n");
	return L;
}
//顺序表的插入
int sqlist_insert(sqlist& l, int i, int e) {
	
	if ((i < 1) || (i > l.length + 1))return ERROR;
	if (l.length == maxsize)return ERROR;
	for (int j = l.length ; j >= i; j--) {
		l.elem[j] = l.elem[j-1];
	}
	l.elem[i] = e;
	++l.length;
	return ture;
}
//顺序表的删除
int sqlist_delete(sqlist& L, int i, int& e) {
	if (i<1 || i>L.length)
	{
		return false;
	}
	e = L.elem[i - 1];//将被删除的元素赋值给e
	for (int j = i; j < L.length; j++)//将第i个位置后的元素前移
	{
		L.elem[j - 1] = L.elem[j];
	}
	L.length--;//长度减1
	return true;
}
int LocateElem(sqlist L, int e)
{
	int i;
	for (i = 0; i <= L.length; i++)
	{
		if (L.elem[i] == e)
			return i + 1;//下标为i的元素值等于e,返回其位序i+1
	}
	return 0;//退出循环,说明查找失败
}
int main() {
	int i, y, cord;
	sqlist La;
	do {
		printf("\n     主菜单     \n");
		printf("1    建立线性表   \n");
		printf("2    插入一个元素 \n");
		printf("3    删除一个元素 \n");
		printf("4    查找一个元素 \n");
		printf("5    退出         \n");
		printf("------------------\n");
		printf("请输入你的选择(1,2,3,4,5)");
		scanf("%d", &cord);
		switch (cord) {
		case 1: {
			Initlist(La);
			creat_sqlist(La);
			printf("List La ");
			print_sqlist(La);
		}break;
		case 2: {
			printf("\n");
			printf("请输入插入元素位置及元素:");
			scanf("%d%d", &i, &y);
			sqlist_insert(La, i, y);
			printf("list Lc ");
			print_sqlist(La);
		}break;
		case 3: {
			printf("请输入删除位置");
			scanf("%d", &i);
			int a = 0;
			sqlist_delete(La,i,a);
			printf("list La ");
			print_sqlist(La);
		}break;
		case 4: {
			int b;
			printf("查找元素\n");
			scanf("%d", &i);
			 b=LocateElem(La, i);
			printf("查找元素的位置是 %d\n", b);
		}break;
		case 5:exit(0);
		}
	} while (cord <= 5);
}

单链表(链式结构)

以下是对单链表链式结构的操作以构建菜单的方式进行

操作包括:前插法,后插法,取值,插入,查找,删除,合并以及删除单链表等。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define NULL 0
typedef int elemtype;
typedef struct LNode {
	elemtype date;
	struct LNode* next;
}LNode, * LinkList;
//初始化
int Initlist_L(LinkList& phead) {
	phead = new LNode;//生成新结点作为头结点,用头指针phead指向头结点
	phead->next = NULL;
	return OK;
}
//插入
int Insertlist_L(LinkList& L, int i, elemtype e) {
	LinkList p;
	int j = 0;
	p = L;
	//查找第i-1个结点,p指向该结点
	while (p && j < i - 1) {
		p = p->next;
		++j;
	}
	if (!p || j > i - 1) {
		printf("插入的位置不合法!\n");
	}
	LinkList s;
	s = new LNode;//生成新结点s
	s->date = e;//将*s的数据域置为e
	s->next = p->next;//将结点*s的指针域指向结点a(i)
	p->next = s;//将结点*p的指针域指向结点*s
	return OK;
}
//删除
int Deletelist_L(LinkList& L, int i) {
	LinkList p = L;
	int j = 0;
	//查找第i-1个结点,p指向该结点
	while ((p->next) && (j < i - 1)) {
		p = p->next;
		++j;
	}
	if (!(p->next) || (j > i - 1)) printf("删除位置不合理");//当i>n或i<1时,删除位置不合理
	LinkList q = p->next;//临时保存被删除结点的地址以备释放
	p->next = q->next;//改变删除结点前驱结点的指针域
	delete q;//释放删除结点的空间
	return OK;
}
//前插法创建单链表
void  CreatlistFromHead_L(LinkList& phead) {
	int e;
	scanf("%d", &e);
	while (e != -1) {
		LinkList s = new LNode;//生成新节点*s
		//将新结点*s插入头结点的后面
		s->date = e;
		s->next = phead->next;
		phead->next = s;
		scanf("%d", &e);
	}
}
//后插法创捷单链表
void CreatlistFromTail_L(LinkList& phead) {
	phead = new LNode;
	phead->next = NULL;//先创建一个带头结点单链表
	LinkList r = phead;//尾指针指向头结点
	int e;
	scanf_s("%d", &e);
	while (e != -1) {
		LinkList s = new LNode;//生成新结点
		s->date = e;
		s->next = NULL;
		r->next = s;
		r = s;//尾指针指向新的尾结点
		scanf("%d", &e);
	}
}
//单链表的输出
void printlist_L(LinkList& L) {
	LinkList p = L->next;
	printf("单链表:");
	while (p) {
		printf("%3d", p->date);
		p = p->next;
	}
	printf("\n");
}
//在单链表中取值
int GetElemlist_L(LinkList& L) {
	printf("请输入取第几个元素");
	int i;
	scanf("%d", &i);
	LinkList p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p)return NULL;
	int e = p->date;
	printf("第%d个元素是:%d\n", i, e);
	return e;
}
//在单链表中查找元素的地址
int LocateElemList_L(LinkList& L, elemtype e) {
	int i;
	LinkList p = L->next;
	i = 1;
	while (p && p->date != e) {
		++i;
		p = p->next;
	}
	if (p)
		return i;
	else
		return NULL;
}
//单链表的长度输出
int Lengthlist_L(LinkList& L) {
	int i = 0;
	LinkList p = L->next;
	while (p!= NULL) {
		++i;
		p = p->next;
	}
	return i;
}
//合并单链表
LinkList Mergelist_L(LinkList& L1, LinkList& L2) {
	LinkList head = new LNode;
	LinkList p1 = L1->next;//指针p1扫描链表L1
	LinkList p2 = L2->next;//指针p2扫描链表L2
	LinkList pre = head;
	while (p1 && p2) {
		if (p1->date <= p2->date) {
			pre->next = p1;
			p1 = p1->next;
		}
		else {
			pre->next = p2;
			p2 = p2->next;
		}
		pre = pre->next;
	}
	pre->next = p1 == NULL ? p2 : p1;
	return head;
}
//销毁单链表
int  Freelist_L(LinkList& L) {
	while (L) {
		LinkList p = L->next;
		free(L);
		L = p;
	}
	printf("单链表已销毁\n");
	return OK;
}
int main() {
	LinkList L1;
	elemtype c, date;//e插入,删除元素,date查找的元素
	int inde, n;//index插入元素的位置,n删除元素的位置
	int num;
	do {
		printf("     主菜单      \n");
		printf("1    前插法      \n");
		printf("2    后插法      \n");
		printf("3     取值       \n");
		printf("4    插入一个元素\n");
		printf("5   查找一个元素 \n");
		printf("6    删除一个元素\n");
		printf("7   合并链表     \n");
		printf("8    删除单链    \n");
		printf("9     退出       \n");
		printf("请输入选择1 2 3 4 5 6\n");
		scanf("%d", &num);
		switch (num)
		{
		case 1: {
			printf("前插法输入(空格分开)");
			Initlist_L(L1);
			CreatlistFromHead_L(L1);//前插法输入L1
			printf("前插法输入单链表L1\n");
			printlist_L(L1);//输出L1
			printf("单链表L1的长度:%d\n", Lengthlist_L(L1));
		}break;
		case 2: {
			printf("后插法输入(空格分开)");
			Initlist_L(L1);
			CreatlistFromTail_L(L1);//前插法输入L1
			printf("前插法输入单链表L1\n");
			printlist_L(L1);//输出L1
			printf("单链表L1的长度:%d\n", Lengthlist_L(L1));
		}break;
		case 3: {
			printlist_L(L1);
			GetElemlist_L(L1);
		}break;
		case 4: {
			
			printlist_L(L1);
			printf("请输入插入元素的位置和元素");
			scanf("%d %d", &inde, &c);
			Insertlist_L(L1, inde, c);
			printlist_L(L1);
		}break;
		case 5: {
			
			printlist_L(L1);
			printf("请输入查找元素");
			scanf("%d", &c);
			int k = LocateElemList_L(L1, c);
			printf("元素%d是第几个%d\n", c, k);
		}break;
		case 6: {
		
			printlist_L(L1);
			printf("请输入删除第几元素");
			scanf("%d", &n);
			Deletelist_L(L1, n);
			printf("单链表:");
			printlist_L(L1);
		}break;
		case 7: {
			LinkList L2;
			printlist_L(L1);
			printf("后插法输入(空格分开)");
			Initlist_L(L2);
			CreatlistFromTail_L(L2);//前插法输入L1
			printf("前插法输入单链表L1\n");
			printlist_L(L2);//输出L2
			LinkList L3 = Mergelist_L(L1, L2);
			printlist_L(L3);
		}break;
		case 8: {
			Freelist_L(L1);
		}break;
		}
	} while (num <= 8);
	return 0;
}

 

 

如果有错误还请大家多多指教!!!

可以在评论区进行交流。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双非码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值