C数据结构线性表之建表 4

建表

1.顺序表建表

#include <stdio.h>

#define maxsize   100

int  createList(int A[], int *length)
{
	scanf("%d", length);
	if(*length > maxsize)
		return 0;
	for(int i=0; i < *length; ++i)
	{
		scanf("%d",A++)
	}
	return 1;
}

2.链表建表

void createLinkList(LNode *head)
{
	head = (LNode *)malloc(sizeof(LNode));
	head->next = NULL;
	LNode *p = NULL, *r = head;
	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 = r->next;
		r->next = p;
		r = p;
	}
}

3.链表应用
键盘输入n个字母,存放入单链表中,字母不重复存入

void createlist(LNode *head)
{
	head = (LNode*)malloc(sizeof(LNode));
	head->next = NULL;
	LNode *p;
	int n;
	char ch;
	scanf("%d", &n);
	for(i=0; i<n; ++i)
	{
		scanf("%s",&ch);
		p = head->next;
		//遍历链表看是否有相同字母
		while(p != NULL)
		{
			if( p->data == ch)
				break;
			p = p->next;
		}
		if(p != NULL)
		{
			p = (LNode*)malloc(sizeof(LNode));
			p->data = ch;
			p->next = head->next;
			head->next = p;
		}
	}
}

4.顺序表前k个字母逆置

void reverse(int a[], int left, int right, int k)
{
	int temp;
	for(int i = left, j = right; i<left+k && i<j; ++i, --j)
	{
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
		//头尾对应位置互换
	}
}

将数组中元素前p个元素和后p个元素保持原序,互换位置

void movep(int a[],  int n, int p)
{
	reverse(a,0,p-1;p);
	reverse(a,p,n-1;n-p);
	//前后p个元素分别逆置
	reverse(a,0,n-1;n);
	
}

5.在线性表中取最值

int maxx(int a[], int n)
{
	int max = a[0];
	int maxidx = 0;
	for(int i = 0; i < n; ++i)
	{
		if(max < a[i])
		{
			max = a[i];
			maxidx = i;
		}
	}
	return maxidx;
}
int minn(int a[], int n)
{
	int min = a[0];
	int minidx = 0;
	for(int i = 0; i < n; ++i)
	{
		if(min > a[i])
		{
			min = a[i];
			minidx = i;
		}
	}
	return minidx;
}

6.在线性表中取最值
已知链表头结点head

//取最大值
LNode *p,*q;
int max = head->next->data;
p = q =head->next;
while(p != NULL)
{
	if(max < p->data)
	{	
		max = p->data;
		q=p;
	}
	p = p->next;
}

//取最小值
LNode *p,*q;
int min = head->next->data;
p = q =head->next;
while(p != NULL)
{
	if(min > p->data)
	{	
		min = p->data;
		q=p;
	}
	p = p->next;
}

链表找最值

void maxFirst(DLnode *head)
{
	DLnode *p = head->rlink, *q = p;
	int max = p->data;
	while(p != NULL)
	{
		if(max < p->data)
		{	
			max = p->data;
			q = p;
		}
		p = p->rlink;
	}
	//删除
	DLnode *l = q->llink, *r = q->rlink;
	l->rlink = r;
	if(r != NULL)//判断r是否为空
		r->llink = l;
	//插入
	q->llink = head;
	q->rlink = head->rlink;
	head->rlink = q;
	q->rlink->llink = q;
}

7.题目应用
在这里插入图片描述

想法:
在这里插入图片描述

LNode *findFirstCommon(LNode *str1, LNode *str2)
{
	int len1 = 0, len2 = 0;
	LNode *p = str1->next, *q = str2->next;
	while(p!=NULL)
	{	
		len1++;
		p = p->next;
	}
	while(q!=NULL)
	{	
		len2++;
		q = q->next;
	}
	for(p=str1->next; len1>len2; len1--)
		p = p->next;
	for(q=str2->next; len1<len2; len2--)
		p = p->next;
	while(p!=NULL && p!=q)
	{	
		p = p->next;
		q = q->next;
	}
	return p;
}

8.划分
想法一:找出枢轴,根据 i,j 关系比较,依次左移右移;当i=j时,将temp存入,划分结束
在这里插入图片描述

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

9.将带头结点的单链表L逆置

//将L头结点断开,将其中元素依次插入到L表中
void reverse(LNode *L)
{
	LNode *p=L->next, *q;
	L->next=NULL;
	while(p!=NULL)
	{
		q = p->next;
		p->next = L->next;
		L->next=p;
		p=q;
	}
}

10.逆序打印表中数据

//类似递归
void reprint(LNode *L)
{
	if(L!=NULL)
	{	
		reprint(L->next);
		printf("%d",L->data);
	}
}

11.合并顺序表表

void mergeList(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++];
		else
			c[k++] = b[j++];
	}
	while(i<m)
		c[k++]=a[i++];
	while(j<n)
		c[k++]=b[j++];
}

12.合并顺链表

void mergeList(LNode *l1,LNode *l2,LNode *c)
{
	LNode *p=l1->next, *q = l2->next,*r = c;
	while(p!=NULL && q!=NULL)
	{
		if(p->data < q->data)
		{
			r->next = p; 
			r = p;
			p = p->next;
		}
		else
		{	
			r->next = q;
			r = q;
			q = q->next;
		}
	}
	if(p == NULL)
		r->next = q;
	if(q == NULL)
		r->next = p;
}


若要得到逆序链表,则将 l1,、l2链表比较后依次插入C中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值