数据结构线性表(1)

线性表操作

1.建立顺序表

int sqlist[maxsize];
int length;
int createlist(int sqlist[],int &length)
{
	cin>>length;
	if(length>maxsize)
		return 0;
	for(i=0;i<length;i++)
		cin>>sqlist[i]
	return 1;
}

1.1在顺序表p的位置插入元素e

int sqlist[maxsize]={1,2,3,.....,n};
int length=n;
int insert(int sqlist[],int &length,int p,int e)
{
	if(p<0||p>length)
	 	return 0;//不符合插入条件
	if(int i=length-1;i>=p;--i)
		sqlist[i+1]=sqlist[i];//从顺序表的最后一个元素
	sqlist[p]=e;
	++length;
	return 1;
}

1.2删除元素

int deleteelm(int sqlist[],int &length,int p,int &e)
{
	if(p<0||p>length-1)
	return 0;
	e=sqlist[p];
	for (int i=p;i<length-1;++i)
		sqlist[i]=sqlist[i+1];//从删掉元素的位置元素逐个前移
	--length;
	return 1;
}

2.建立链表
2.1尾插发

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode;//定义链表结点
void creatlinklistR(LNode *&head)
{
	head=(LNode*)malloc(sizeof(LNode));
	head->next=NULL;
	LNode *p=NULL,*r=head;//用p指向新插入的结点,r指向尾结点
	int n;//用户输入链表长度
	scanf('%d',&n);
	for(int i =0;i<n;++i)
	{
		p=(LNode*)malloc(sizeof(LNode));
		p->next=NULL;
		scanf('%d',&(p->data));
		r->next=p;
		r=p;
	}
}

2.2头插法

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode;//定义链表结点
void creatlinklistR(LNode *&head)
{
	head=(LNode*)malloc(sizeof(LNode));
	head->next=NULL;
	LNode *p=NULL;//用p指向新插入的结点
	int n;//用户输入链表长度
	scanf('%d',&n);
	for(int i =0;i<n;++i)
	{
		p=(LNode*)malloc(sizeof(LNode));
		p->next=NULL;
		scanf('%d',&(p->data));
		p->next=head->next;
		head->next=p;
	}
}

3.链表的删除某个结点
对于链表而言,就很简单

q=p->next;//删除p的后继结点
p->next=p->next->next;
free(q);

4.表的逆置
假设将数组a[1,2,3,4,5,6]逆置为a[6,5,4,3,2,1]
对于顺序表而言,基本思想就是一个for循环

for(int i=left,j=right;i<j;++i,--j)
{
	temp=a[i];
	a[i]=a[j];
	a[j]=temp;
}

而对于链表来说,逆置p->next到q之间的结点

while(p->next!=q)//p指向链表中q前面的某个结点,q指向链表中某一个结点
{
	t=p->next;//t始终指向要移动的链表结点,即在p的next
	p->next=t->next;
	t->next=q->next;
	q->next=t;
}

5.表的取最值
加入取最大值,对于顺序表来说

int max=a[0]
int maxind=0;
for (int i=0;i<n;++i)
{
	if(max<a[i])
	{	
		max=a[i];
		maxind=i;
	}
}

对于链表而言

LNode *p,*q;
int max=head->next->data;
q=p=head->next;//p指针用来扫描链表,q指针用来标记当前已得最大值的链表
while(p!=NULL)
{
	if(max<p->data)
	{
		max=p->data;
		q=p;
	}
	p=p->next;//p指针扫描链表
}

6.表的归并
对于顺序表来说

void merge(int a[],int m,int b[],int n,int c[])
{
	int i=0,j=0//分别为两个数组的第一个数的下标
	int k=0;
	while(i<m&&j<n)
	{
		if(a[i]<b[j])//按照升序合并
			c[k]=a[i];
			k++;
			i++;
		else
			c[k]=b[j];
			k++;
			j++;
	}
	while(i<m)//当a数组中的元素有剩余
		c[k]=a[i];
		k++;
		i++;
	while(j<n)//当b数组中的元素有剩余
		c[k]=b[j];
		k++;
		j++;
}

对于链表来说

void merge(LNode *A,LNode *B,LNode *&C)
{
	LNode *p=A->next;
	LNode *q=B->next;
	LNode *r;//始终标记C尾部位置的指针
	C=A;
	C->next=NULL;
	free(B);//释放掉B的头结点
	r=C;
	while(p!=NULL&&q!=NULL)
	{
		if(p->data<=q->data)
		{
			r->next=p;p=p->next;
			r=r->next;//r指向此时的尾结点
		}
		else
		{
			r->next=q;q=q->next;
			r=r->next;//r指向此时的尾结点
		}
	}
	if(p!=NULL)
	r->next=p;
	if(p!=NULL)
	r->next=q;
}

7.表的划分
将顺序表中的元素以某个数为界限划分为左右两个部分

void partition(int a[],int n)
{
	int temp;
	int i=0,j=n-1;
	temp=a[0];
	while(i<j)
	{
		while(i<j&&a[j]>=temp) --j;
		if(i<j)
		{
			a[i]=a[j];
			++i;
		}
		while(i<j&&a[i]<=temp) ++i;
		if(i<j)
		{
			a[j]=a[i];
			--j;
		}
	}
	a[i]=temp;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值