算法上对顺序存储(顺序表)和链式存储(链表)上增,删,查,显的一体设计

一.顺序表

#include <stdio.h>
#define maxsize 100
#include <stdlib.h>
#define error 0
#define ok 1
typedef int elemtype;
	elemtype elem[maxsize];
	int length;
}sqlist;

typedef struct {


sqlist* creatlist()   //初始化
{
	sqlist* L;
	L = (sqlist*)malloc(sizeof(sqlist));//在内存上腾出一个空间
	if (!L)
		return NULL;
	else {
		L->length = 0;
		return L;
	}
}

void assignsqlist(sqlist * L)   //顺序表赋值(sqlist * L:指向顺序表地址)
{
	int i;
	printf("请输入元素个数:");
	scanf_s("%d", &L->length);
	printf("按照元素个数依次输入元素值:");
	for (i = 0; i < L->length; i++)
		scanf_s("%d", &L->elem[i]);
}

void outputsqlist(sqlist* L)   //输出
{
	int i;
	printf("顺序表的长度是%d\n", L->length);
	printf("顺序表的元素依次是:");
	for (i = 0; i < L->length; i++)
		printf("%4d", L->elem[i]);
	printf("\n");
}

int insertsqlist(sqlist* L, int i, elemtype e)    //插入
{
	int j;
	if (i<1 || i>L->length + 1)
		return error;
	if (L->length >= maxsize) {
		printf("线性表溢出\n");
		return error;
	}
	for (j = L->length - 1; j >= i - 1; --j)
		L->elem[j + 1] = L->elem[j];
	L->elem[i - 1] = e;
	L->length++;
	return ok;
}

int deletesqlist(sqlist* L, int i)     //删除
{
	int j;
	if (i<1 || i>L->length)
		return error;
	if (L->length <= 0) {
		printf("线性表为空\n");
		return error;
	}
	for (j = i; j <= L->length - 1; ++j)
		L->elem[j - 1] = L->elem[j];
	L->length--;
	return ok;
}

int getData(sqlist *L, int i) {    //按照元素位查询

	if (i<1 || i>L->length)
	{
		printf("顺序表越界!\n");
		exit(0);
	}
	return ok;
}


int locate(sqlist* L, int e) {
	int i = 0;
	while (i <= L->length && L->elem[i] != e) {
		i++;
	}
	if (i <L->length && L->elem[i] == e)
	{
		return i + 1;
	}

	return -1;
}

int main() {
	sqlist * L = nullptr;
	int k, i, e;
	do
	{
		printf("\n\n\n\n");
		printf("\t\t\t 链表子系统\n");
		printf("\t\t*******************************\n");
		printf("\t\t*        1----初 始 化     *\n");
		printf("\t\t*        2----赋    值    *\n");
		printf("\t\t*        3----删  除    *\n");
		printf("\t\t*        4----插  入    *\n");
		printf("\t\t*        5----显  示    *\n");
		printf("\t\t*        6----按下标查询   *\n");
		printf("\t\t*        7----按元素查询   *\n");
		printf("\t\t*        0----返  回    *\n");
		printf("\t\t*******************************\n");
		printf("\t\t 请选择菜单项(0-7):");
		scanf_s("%d", &k); //getchar();
		switch (k)
		{
		case 1:
			L = creatlist();
			if (L == NULL)  printf("初始化顺序表失败\n");
			else printf("初始化顺序表成功\n");
			break;
		case 2:
			assignsqlist(L);
			outputsqlist(L);
			break;
		case 3:
			printf("请输入删除元素的位置:");
			scanf_s("%d", &i);
			k = deletesqlist(L, i);
			if (k == 1)
			{
				printf("删除操作成功,删除元素后顺序表如下\n");
				outputsqlist(L);
			}
			else printf("删除操作失败\n");
			break;
		case 4:
			printf("请输入插入位置和插入数据:");
			scanf_s("%d%d", &i, &e);
			k = insertsqlist(L, i, e);
			if (k == 1) {
				printf("插入操作成功!插入元素后顺序表如下\n");
				outputsqlist(L);
			}
			else printf("插入操作失败\n");
			break;
		case 5:
			outputsqlist(L);
			break;
		
		case 6:

			printf("请输入要查找的元素:");
			scanf_s("%d", &e);
			getData(L ,e);
			printf("你查找的下标是:%d",L->elem[e-1]);
			break;

		case 7:
			int index;
			printf("你输入查找的元素:");
			scanf_s("%d",&e);
			index = locate(L,e);
			printf("你查找的元素%d在第%d的位置。\n",e,index);
			break;
		case 0:
			exit(0);
			break;
		}
	} while (k != 0);
	system("pause");//
	return 0;
}

二.链表设计

#include <stdio.h>
  #include <stdlib.h>

typedef int elemtype;
typedef struct Node {
	elemtype data;
	struct Node* next;
}linknode, * linklist;
linklist init_linklist() {
	linklist l;
	l = (linklist)malloc(sizeof(linknode));
	l->next = NULL;
	return l;
}
linklist Creat_LinkList_1() //尾插入法建立单链表算法
{
	linklist head, rear;           //头指针,尾指针
			head = (linklist)malloc(sizeof(linknode));
			head ->next = NULL;
			rear = head;
			linknode  *s;             //定义一个待插入结点数据类型
	elemtype x;              //设待插入数据元素的类型为int

	        printf("请输入每个结点的值域(0结束): ");
	        scanf_s("%d", &x);
	while (x != 0)          //当输入的值不为0时,进入循环
	{
				s = (linklist)malloc(sizeof(linknode));      //申请新结点
				s->data = x;               //对新结点赋值
				s->next = rear->next;
				rear->next = s;
				rear = s;
				scanf_s("%d", &x);          //输入新数据
	}
	return head;
}
/*单链表的查找--按序号查找(运用的是尾插法)
  在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
linknode* locatenode(linklist head, elemtype i)
{
	linknode *p;
	int j = 0;       //将头结点的位置设为0
	p = head;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (j == i)
		return p;
	else
		return NULL;
}
/*单链表的查找--按值查找(运用的是尾插法)
  在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
linknode* locatenode_1(linklist head, elemtype x) {
	linknode* p;
	p = head->next;
	while (p && p->data != x)
		p = p->next;
	return p;
}
/*插入运算 Insert_LinkList(L,i,x)   头结点前不能插入结点
在单链表L的第i个位置上插入值为x的元素*/
linklist insert_linklist(linklist L, int i, elemtype x)
{
			linknode * p, * s;
			int j = 0;                //设头结点的位置为0
			p = L;
			while (p && j < i - 1)     //p指向第i-1个结点
			{
				p = p->next;
				j++;
			}
			if (p == NULL) {
				printf("插入位置失败\n");
				return NULL;
	        }
			else {
				s = (linknode *)malloc(sizeof(linklist));
				s->data = x;
				s->next = p->next;
				p->next = s;
				return p;
			}
}
/*删除运算     删除单链表L的第i个位置上的元素*/
int del_linklist(linklist L, elemtype i)
{
	linknode* p, * s;
	elemtype x;
	p = L;
	s = locatenode(p, i - 1);
	if (s == NULL)
	{
		printf("第i-1个结点不存在");
		return 0;
	}
	else if (s->next == NULL)
	{
		printf("第i个结点不存在");
		return 0;
	}
		 else
		 {
			p = s->next;
			s->next = p->next;
			x = p->data;
			free(p);
			return x;
		 }
}
void outputnode(linklist L)           //输出单链表
{
	linknode* p;
	p = L->next;            //指向头结点后的第一个结点
	while (p->next != NULL)
	{
		printf("%d->", p->data);    //输出表中非最后一个元素
		p = p->next;
	}
	printf("%d\n", p->data);      //输出表中最后一个元素    
}
int main() {
	linklist L;
	L = init_linklist();
	int i, e, k;
	linknode* p;
	elemtype x;
	do
	{
		printf("\n\n\n\n");
		printf("\t\t\t 链表子系统\n");
		printf("\t\t*********************************\n");
		printf("\t\t*        1----初  始  化     *\n");
		printf("\t\t*        2----赋      值    *\n");
		printf("\t\t*        3----插    入     *\n");
		printf("\t\t*        4----删    除    *\n");
		printf("\t\t*        5----显    示    *\n");
		printf("\t\t*        6----按序号查询    *\n");
		printf("\t\t*        7----按值  查询    *\n");
		printf("\t\t*        0----返    回    *\n");
		printf("\t\t*********************************\n");
		printf("\t\t 请选择菜单项(0-7):");
		scanf_s("%d", &k); //getchar();
		switch (k)
		{
		case 1:
			L = init_linklist();
			if (L == NULL)  printf("初始化顺序表失败\n");
			else printf("初始化顺序表成功\n");
			break;
		case 2:
			L = Creat_LinkList_1();
			printf("表的存储顺序为:");
			outputnode(L);
			break;
		case 3:
			printf("请输入插入位置和插入数据:");
			scanf_s("%d%d", &i, &e);
			p = insert_linklist(L, i, e);
			if (p != NULL) {
				printf("插入操作成功!插入元素后顺序表如下\n");
				outputnode(L);
			}
			else printf("插入操作失败\n");
			break;
		case 4:
			printf("请输入删除元素的位置:");
			scanf_s("%d", &i);
			k = del_linklist(L, i);
			if (k == 0)
				printf("删除失败\n");
			else
			{
				printf("删除成功\n");
				printf("删除元素值为 %d\n", k);
				printf("删除后链表存储顺序为:");
				outputnode(L);
			}
			break;
		case 5:
			printf("表的存储顺序为:");
			outputnode(L);
			break;
		case 6:
			L = Creat_LinkList_1();
			printf("请输入要查找的序号i(头结点的序号为0):");   //头结点的序号为0
			scanf_s("%d", &i);
			p = locatenode(L, i);
			if (p == NULL)
				printf("查询失败,没有此元素\n");
			else
				printf("查询成功\n");
			outputnode(L);
			printf("中序号为 %d 的值是 %d ", i, p->data);
			break;
		case 7:
			L = Creat_LinkList_1();
			printf("请输入待查找的元素值:");
			scanf_s("%d", &x);
			p = locatenode_1(L , x);
			if (p == NULL)
				printf("查询失败,没有此元素\n");
			else
				printf("查询成功\n");
			break;
		}
	} while (k != 0);
	return 0;
}

注意:代码框架不是为我所有,但是核心代码的编写是自己参考实例实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值