数据结构-顺序表的基本操作(超详细)-输出、插入、删除、查找、表长

希望以下内容可以帮助到大家^v^ 如果各位小伙伴们觉得写的不错就点一个赞再走哇,有不懂可在评论区留言,如果发现错误,欢迎大家指出来。

首先,顺序表的存储结构为:

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
	ElemType data;
	struct node*next;
}LNode,*LinkNode;

//创建顺序表 
LNode*creat(int n)

head为头指针,pnew为头结点,prear为尾结点,然后从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针

LNode*creat(int n)
{	
	LNode*head,*pnew,*prear;//LinkNode head,pnew,prear;
	head=(LNode*)malloc(sizeof(LNode));//从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针
	head->next=NULL;
	prear=head;
	for(int i=0;i<n;i++)
	{		pnew=(LNode *)malloc(sizeof(LNode));
		scanf("%d",&pnew->data);
		prear->next=pnew;
		prear=pnew;
	}
	prear->next=NULL;
	return head;	
}

//输出顺序表 
void output(LNode *head)

void output(LNode *head)
{	LNode *p=head;
	if(p)
		p=head->next;
	while(p)
	{	printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

//顺序表长度 
int length(LNode *head)

注意:线性表长度不是0开始哦,但是数组是从0开始

int length(LNode *head)
{	LNode *p=head;
	int len=0;
	while(p->next)
	{	p=p->next;
		len++;
	}
	return len;
}

//按位置查找,线性表第i个位置元素返回给e 
LNode *getElem(LNode *head,int i)

注意事项:

1.判断p或者p->next是否为空

2.查找位置不合法就返回NULL

LNode *getElem(LNode *head,int i)
{	LNode *p=head;
	int j=0;
	while(p->next&&j<i)//p&&j<i
	{	p=p->next;
		j++;
	}
	if(j==i)  return p;
	else return NULL;
}

//按值查找 
LNode *lacateElem(LNode *head,ElemType x)

注意事项:

1.判断p或者p->next是否为空

2.如果查找成功,之后就输出该值。.查找值不成功就返回NULL

LNode *lacateElem(LNode *head,ElemType x)
{	LNode *p=head->next;
	while(p&&p->data!=x)
	{	
		p=p->next;
	}
	if(p)
	return p;	
	else
	return NULL;
}

//插入 
void insertLink(LNode *head,int i,ElemType x)

注意事项:

1.判断p或者p->next是否为空

2.插入位置的合法性

void insertLink(LNode *head,int i,ElemType x)
{
	LNode *p=head,*s;
	int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(p!=NULL&&j==i-1)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=p->next;
		p->next=s;
	}
}

//删除
void intdelLink(LNode*head,int i)

注意:要释放删除的结点

void intdelLink(LNode*head,int i)
{
LNode*p=head,*s;
p=getElem(p,i-1);
if(p!=NULL&&p->next!=NULL)
{
	s=p->next;
	p->next=s->next;
	free(s);
}
}

以上就是顺序表的基本步骤,下面附上顺序表的完整代码:

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
	ElemType data;
	struct node*next;
}LNode,*LinkNode;
//创建顺序表 
LNode*creat(int n)
{	
	LNode*head,*pnew,*prear;//LinkNode head,pnew,prear;
	head=(LNode*)malloc(sizeof(LNode));//从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针
	head->next=NULL;
	prear=head;
	for(int i=0;i<n;i++)
	{		pnew=(LNode *)malloc(sizeof(LNode));
		scanf("%d",&pnew->data);
		prear->next=pnew;
		prear=pnew;
	}
	prear->next=NULL;
	return head;	
}
//输出顺序表 
void output(LNode *head)
{	LNode *p=head;
	if(p)
		p=head->next;
	while(p)
	{	printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
//顺序表长度 
int length(LNode *head)
{	LNode *p=head;
	int len=0;
	while(p->next)
	{	p=p->next;
		len++;
	}
	return len;
}
//按位置查找,线性表第i个位置元素返回给e 
LNode *getElem(LNode *head,int i)
{	LNode *p=head;
	int j=0;
	while(p->next&&j<i)//p&&j<i
	{	p=p->next;
		j++;
	}
	if(j==i)  return p;
	else return NULL;
}
//按值查找 
LNode *lacateElem(LNode *head,ElemType x)
{	LNode *p=head->next;
	while(p&&p->data!=x)
	{	
		p=p->next;
	}
	if(p)
	return p;	
	else
	return NULL;
}
//插入 
void insertLink(LNode *head,int i,ElemType x)
{
	LNode *p=head,*s;
	int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(p!=NULL&&j==i-1)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=p->next;
		p->next=s;
	}
}
//删除
void intdelLink(LNode*head,int i)
{
LNode*p=head,*s;
p=getElem(p,i-1);
if(p!=NULL&&p->next!=NULL)
{
	s=p->next;
	p->next=s->next;
	free(s);
}
}
int menu()
{	int i;
	printf("|-----顺序表基本操作------|\n");
	printf("|-----1.输出--------------|\n");
	printf("|-----2.按位置查找--------|\n");
	printf("|-----3.按值查找----------|\n");
	printf("|-----4.求表长------------|\n");
	printf("|-----5.插入--------------|\n");
	printf("|-----6.删除--------------|\n");

	printf("|-----0.退出-----\n");

	do{	printf("请输入选项(0-7):");
		scanf("%d",&i);
	}while(i<0||i>6);
	return i;
}
int main()
{	LNode *head;int n;
	scanf("%d",&n);	head=creat(n);
	while(1)
	{	switch(menu())
		{case 0:exit(0);break;
		 case 1:output(head);break;
		 case 2:{int i;LNode *p;
		 	printf("输入查找的序号:");
		 	scanf("%d",&i);
		 	p=getElem(head,i);
		 	if(p) printf("第%d个位置的值是%d\n",i,p->data);
		 	else printf("查找失败\n");
			break;
		 }
		 case 3:{int i;LNode *p;
		 	printf("输入查找的值:");
		 	scanf("%d",&i);
		 	p=lacateElem(head,i);
		 	if(p)
		 	printf("结点的值:%d\n",p->data);
		 	else printf("查找失败\n");
			break;
		 }
		 case 4:{
		 		printf("%d\n",length(head));
				break;
		 }
		 case 5:{printf("输入插入的元素和位置");
		 		int x,i;
				scanf("%d%d",&x,&i);
				insertLink(head,i,x);
				output(head);
				break;
		 }
		 case 6:{int i;
		 		printf("输入删除的位置:");
		 		scanf("%d",&i);
		 		intdelLink(head,i);
		 		output(head);
			break;
		 }
		}
	}	
	return 0;
}

附上运行结果:

 

  • 13
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值