顺序表、链表的相关操作

年轻人要全力以赴,加油陌生人!

文章目录


前言

Hello,大家好,我是慢慢努力的小刘,今天给大家分享两道线性表操作的题目。第一道是顺序表的操作,第二道是链表的操作。希望能对大家有所帮助。

一、顺序表的操作

问题描述:

已知一个顺序表L,其中的元素递增有序排列,设计一个算法,插入一个元素x(int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。

分析:由题干可知,解决本题需完成两个操作:
1)找出可以让顺序表保持有序的插入位置。
2)将步骤1)中找出的位置上以及其后的元素往
后移动一个位置,然后将x放至腾出的位置上。

上代码:
 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define maxsize 100
//以知有个顺序表,首先将顺序表中元素升序排列,在从键盘中输入一个数据,将他插入到顺序表中,插入后,表依旧是升序。
typedef struct
{
	int data[maxsize];
	int length;
}sqlist;
void CreatList(sqlist* p, int n) {//链表信息的输入,
	int i;
	p->length = 0;
	for (i = 0; i < n; i++)
	{
		printf("请输入第%d个节点的信息:\n", i + 1);
		fflush(stdin);
		scanf("%d", &p->data[i]);
		p->length++;
	}
}
void Paixu(sqlist* &p, int n) {//升序排
	int i;
	int temp = p->data[0];
	int j;
	for (i = 0; i < p->length - 1; i++) {
		for (j = 0; j < p->length - 1 - i; j++) {
			if (p->data[j] > p->data[j + 1]) {
				temp = p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = temp;
			}
		}
	}

}
int Foudindex(sqlist* p,int x) {//查找插入的位置;
	int i;
	for (i = 0; i < p->length; i++) {
		if (x < p->data[i])
		{
			return i;
		}
	}
	return i;//刚好在链表的末尾插入这个数据;
}
void Insert(sqlist* &p ,int x) {//&是因为这个指针自身要改变
	int i;
	int ardess;
	ardess = Foudindex(p, x);
	for (i = p->length - 1; i >= ardess;i--) {
		p->data[i + 1] = p->data[i];//所有的元素都往后移动一位;
	}
	p->data[ardess] = x;
	p->length++;
}
void Output(sqlist* p) {//输出函数
	int i;
	printf("节点的信息如下:\n");
	for (i = 0; i < p->length-1; i++) {
		printf("%d", p->data[i]);
		printf(" ");
	}
	if (i = p->length - 1) {
		printf("%d", p->data[i]);
	}
}
int main() {
	int n, x;
	printf("请输入结点的个数:\n");
	fflush(stdin);
	scanf("%d", &n);
	sqlist* p;
	p = (sqlist*)malloc(sizeof(sqlist));
	CreatList(p, n);
	Paixu(p, n);
	printf("插入前的链表信息:\n");
	fflush(stdin);
	Output(p);
	printf("\n请输入你要插入的数据:");
	scanf("%d", &x);
	Insert(p, x);
	Output(p);
	return 0;
}


 

二、链表的操作

问题描述:

A和B是两个单链表(带表头结点),其中元素递增有序。设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由A和B中的结点组成。
 

分析:

A、B中的元素递增有序,要使归并后的C中元素依然有序,可以从A、B中挑出最小的元素插入C的尾部,这样当A、B中的所有元素都插入C中时,C一定是递增有序的。哪一个元素是A、B中最小的元素呢?很明显,由于A、B是递增的,因此A中的最小元素是其开始结点中的元素,B也一样。只需从A、B的开始结点中选出一个较小的来插入C的尾部即可。这里还需注意,A与B中的元素有可能一个已经全部被插入到C中,另一个还没有插完,如A中所有元素已经全部被插入到C中,而B还没有插完,这说明B中的所有元素都大于C中的元素,因此只要将B链接到C的尾部即可。如果A没有插完,则用类似的方法来解决。、


.上代码:
 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef struct Lnode {
	int data;
	struct Lnode* next;
}Lnode;
void CreatList(Lnode* p, int n) {
	{
		int  i;//n表示要输入数据的个数,i是循环变量;
		Lnode * r, * q;
		for (i = 1; i <= n; i++)
		{
			q = (Lnode*)malloc(sizeof(Lnode));
			q->next = NULL;
			printf("请输入第%d个数据:\n", i);
			fflush(stdin);
			scanf("%d", &q->data);
			if (i == 1)
			{
				p->next = q;
				r = q;
			}
			else
			{
				r->next = q;
				r = q;
			}
		}
		return;
	}
}
void SortList(Lnode* head, int n) {
	int i;
	Lnode* p, * q;
	int t;
	p = (Lnode*)malloc(sizeof(Lnode));
	q = (Lnode*)malloc(sizeof(Lnode));
	for (p = head->next; p != NULL; p = p->next) {
		for (q = p->next; q != NULL; q = q->next) {
			if (q->data < p->data) {
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
}
void OutList(Lnode* head) {
	Lnode* p;
	p = head->next;
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->next;
	}
}
void merge(Lnode* Ahead, Lnode* Bhead, Lnode*& Chead)//Chead前加个&是应为Chead本身要改变,所以用引用型
{
	Lnode* p = Ahead->next;//p用来跟踪A的最小值;
	Lnode* q = Bhead->next;// q用来跟踪B的最小值;
	Lnode* r;//r用来指向C的终端;
	Chead = (Lnode*)malloc(sizeof(Lnode));
	Chead = Ahead;//链表A做链表C的头结点;
	Chead->next = NULL;
	free(Bhead);//B现在没用释放掉;
	r = Chead;
	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;
		}
	}
	r->next = NULL;
	if (p != NULL)
	{
		r->next = p;
	}
	else
	{
		r->next = q;
	}
}
int main() {
	Lnode* Ahead;
	Ahead = (Lnode*)malloc(sizeof(Lnode));
	Ahead->next= NULL;
	int n;
	printf("请输入链表A数据的个数:\n");
	scanf("%d", &n);
	CreatList(Ahead, n);//创建;
	printf("链表A的信息如下:\n");
	OutList(Ahead);//输出
	SortList(Ahead, n);//排序
	printf("\nA链表排序后的顺序如下:\n");//链表中的数据升序排列;
	OutList(Ahead);
	printf("\n*******************************************************\n");
	Lnode* Bhead;
	Bhead = (Lnode*)malloc(sizeof(Lnode));
	Bhead->next = NULL;
	int m;
	printf("请输入链表B数据的个数:\n");
	scanf("%d", &m);
	CreatList(Bhead, m);//创建;
	printf("B链表的信息如下:\n");
	OutList(Bhead);//输出
	SortList(Bhead, m);//排序
	printf("\nB链表排序后的顺序如下:\n");//链表中的数据升序排列;
	OutList(Bhead);
	Lnode* Chead;
	Chead = (Lnode*)malloc(sizeof(Lnode));
	Chead->next = NULL;
	merge(Ahead, Bhead, Chead);//将链表A和B合并成C;
	printf("\nC链表的数据如下:\n");
	OutList(Chead);
	return 0;
}


总结

更新了,如果对大家有帮助·,大家就关注一波呗!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值