年轻人要全力以赴,加油陌生人!
前言
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;
}
总结
更新了,如果对大家有帮助·,大家就关注一波呗!