有一个数据表,目前含有10个数据,现要求在这组数值上完成初始化、显示、插入、删除、定位、求长度等操作-C语言

有一个数据表,目前含有10个数据,现要求在这组数值上完成初始化、显示、插入、删除、定位、求长度等操作。-menu方法

#include"stdio.h"

//定义顺序表类型
#define DATATYPE1 int
#define MAXSIZE 100
typedef struct
{
	DATATYPE1 datas[MAXSIZE];
	int last;
}SEQUENLIST;

void init_seqlist(SEQUENLIST *a)
{//初始化,将顺序表a初始化,数据表中第一个元素的下标为1
	a->last=0;
}

void print_seqlist(SEQUENLIST *a)
{//打印函数
	int i;
	printf("顺序表元素为:\n");
	for(i=1;i<=a->last;i++)
	{
		printf("%5d",a->datas[i]);
	}
	printf("\n");
}

int insert_seqlist(SEQUENLIST *a,DATATYPE1 x,int i)//a是顺序表,x是插入值,i是插入位置
{//插入函数
	int k;
	if(i<1||i>a->last+1||a->last>=MAXSIZE)//i的非法位置
	return 0;
	else
	{
		if(i>a->last)//i在最后面时
		{
			a->datas[i]=x;
			a->last=i;
		}
		else
		{
			for(k=a->last;k>=i;k--)//i在中间时
				a->datas[k+1]=a->datas[k];
			a->datas[i]=x;
			a->last=a->last+1;
		}
		return 1;
	}
}

int delete_seqlist(SEQUENLIST *a,int i)//a为顺序表,i为删除的位置
{//删除函数
	int k;
	if(i<1||i>a->last||a->last==0)//i的非法位置
	{	
		return 0;
	}
	else
	{
		for(k=i;k<a->last;k++)
			a->datas[k]=a->datas[k+1];			
		a->last--;
		return 1;
	}
}
int locate_seqlist(SEQUENLIST *a,DATATYPE1 x)
{//定位函数
	int k;
	k=1;
	while(k<=a->last&&a->datas[k]!=x)
		k++;
	if(k<=a->last)
		return k;
	else
		return 0;
}

int length_seqlist(SEQUENLIST *a)
{//求长度
	return a->last;
}
void menu(void)
{
	printf("\n\n  顺序表操作(请注意第一步操作,请选择1,先进行初始化)");
	printf("\n*********************************************************");
	printf("\n    1 初始化顺序表         2 插入一个元素");
	printf("\n    3 删除一个元素         4 元素定位");
	printf("\n    5 求顺序表长度         6 显示数据表");
	printf("\n    0 退出");
	printf("\n*********************************************************");
}
main()
{
	SEQUENLIST a;
	int x,i,k;
	menu();
	printf("\n请输入菜单序号:");
	scanf("%d",&i);
	while(i!=0)
	{
		switch(i)
		{	
		case 1:init_seqlist(&a);
			menu();
			break;

		case 2:
			printf("\n请输入一个整数:");
			scanf("%d",&x);
			printf("\n请输入插入的序号:");
			scanf("%d",&k);
			if(insert_seqlist(&a,x,k)!=0)
				menu();
			else printf("操作有误\n");
			break;

		case 3:
			printf("\n请输入删除的序号:");
			scanf("%d",&k);
			if(delete_seqlist(&a,k)!=0)
				menu();
			else printf("操作有误\n");
			break;

		case 4:
			printf("\n请输入一个整数:");
			scanf("%d",&x);
			if(locate_seqlist(&a,x)!=0)
				printf("\n%d在顺序表中的序号是%d",x,locate_seqlist(&a,x));
			else printf("\n%d不在顺序表中",x);
			menu();
			break;

		case 5:
			printf("\n顺序表的长度为:%d",length_seqlist(&a));
			break;

		case 6:
			printf("\n顺序表为:");
			print_seqlist(&a);
			menu();
			break;

		default:printf("\n操作有误");
		}
		printf("\n请输入菜单序号:");
		scanf("%d",&i);
	}
}

关注下面这个关注号,了解更多信息

头顶渐突终不悔,代码道出我的爱。

### 数据结构中的链表 #### 定义与特点 链表是一种线性数据结构,其特点是通过一节点来表示集合中的一系列元素。每个节点包含两部分:一部分用于存储实际的数据;另一部分是一个指向下一个节点的链接地址(即指针)。这种特性使得链表能够灵活地管理内存空间,在动态分配方面具有优势[^1]。 #### 节点定义 对于C/C++语言来说,通常采用结构体的方式来定义单向链表的节点: ```c typedef struct ListNode { int val; // 存储的实际数值 struct ListNode *next; // 指向下个结点的指针 }ListNode; ``` 这里`val`用来保存具体的信息或者对象,而`next`则负责记录后续位置所在的位置信息以便遍历整个列表。 #### 基本操作函数说明 - **创建新节点** 为了方便初始化一个新的节点实例,可以编写如下辅助方法: ```c // 创建新的节点并返回该节点的首地址 ListNode* createNode(int value){ ListNode* newNode=(ListNode*)malloc(sizeof(ListNode)); newNode->val=value; newNode->next=NULL; return newNode; } ``` 此段代码实了为给定值建立对应的节点实体,并将其作为独立个体加入到已有的序列当中去。 - **插入节点** 当需要在一个定位置处新增加一个元素时,则可以通过调整前后相邻两个单元之间的连接关系完成这项工作。例如在头插法的情况下只需要改变头部引用即可实快速添加效果。 ```c void insertAtHead(ListNode** head, int newValue){ ListNode* temp=createNode(newValue); temp->next=*head; *head=temp; } ``` 值得注意的是,由于涉及到了对外部变量(`head`)修改的需所以传递参数采用了二级指针形式以确保内部更改能反映在外层作用域之中。 - **删除特定项** 如果想要移除某个符合条件的对象同样也需要遵循相似的原则——先定位再断开关联最后释放资源。 ```c bool deleteValue(ListNode** head,int targetVal){ if(*head==NULL)return false; ListNode* current=*head,*prev=NULL; while(current!=NULL && current->val !=targetVal ){ prev=current; current=current->next; } if (current == NULL) return false; if(prev==NULL){ // 删除一个匹配项且它正好位于开头的情形特殊处理 *head=(*head)->next; free(current); return true; }else{ prev->next=current->next; free(current); return true; } } ``` 上述逻辑覆盖了一般情况下的查找并消除过程,同时也考虑到了边界条件如目标不存在或是处于起始端的情况如何妥善处置等问题。 - **查询功能** 提供一种简单的迭代方式用作检索是否存在某数存在于当前范围内。 ```c bool contains(const ListNode* head,const int searchKey){ const ListNode* tmp=head; while(tmp!=nullptr&&tmp->val!=searchKey){ tmp=tmp->next; } return tmp!=nullptr; } ``` 这段程序利用循环不断前进直到找到相等的关键字或者是到达终点为止从而判断是否含有预期成员存在于此容器之内。 - **清空链表** 最终还应该具备清理全部内容的能力,这一步骤往往意味着要逐一遍历每一个成部分直至结束并将它们一一销毁防止造成泄露象发生。 ```c void clearList(ListNode** head){ ListNode* curr=*head; while(curr!=NULL){ ListNode* nextItem=curr->next; free(curr); curr=nextItem; } *head=NULL; } ``` 以上就是有关于基本型态下双向不带环路版本的操作集锦。 #### 应用场景举例 链表因其灵活性被广泛应用于各种场合比如文件系统的路径解析、浏览器历史记录回溯机制还有undo/redo命令模式的设计思路里都可以见到它的身影。另外像LRU缓存淘汰算法也依赖于双端队列这一变种形态来进行高效运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值