PTA DSC 实验11 链表

在作学校的PTA作业时发现,如果不追求运行效率的话,可以先写出一些实用的方法,之后进行组装就,(其实就是进行模块化设计),这样就可以提高编写效率了。

1.下面是做题时比较实用的方法:

(因为以完成PTA的作业为目标,所以很多用户可能输入的,情况都没有考虑在内,有需要的可以自己改一改,再次强调,时空开销很大!!真的很大!!但是简化了使用)很多函数都是拿前面已经编写过的函数改的,所以注释可能有点问题

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct {
	int data;
	struct LNode* next;
}LNode, *LinkList;

//初始化并创建一个空列表
LinkList newList() {
	//声请一块空间作为头节点
	LinkList List = (LinkList*)malloc(sizeof(LinkList));
	//让他的next指向空
	List->next = NULL;
	//将这个只有头节点的单链表返回回去
	return List;
}

//添加元素的方法
int append(LinkList L,int num) {
	//1先申请一块空间,用于存放新的数据
	LinkList newNode = (LinkList*)malloc(sizeof(LinkList));
	//2把要存放的数据放进去
	newNode->data = num;
	newNode->next = NULL;
	//3现在就需要找到为尾节点,然后将新节点挂上去就好
	//3.1定义尾节点指针
	LinkList tail;
	//3.2让这个指针都指向传入的列表的头节点;
	tail = L;
	//如果这个节点的next不为空,就证明他不是最后一个节点
	while (tail->next!=NULL) {
		//尾指针就指向下一个节点
		tail = tail->next;
	}
	//反之则为最后一个节点,然后就将这个节点(最后一个节点)的next指向新节点
	tail->next = newNode;
	return num;
}

//查看所有元素的方法
bool displayAllElement(LinkList L) {
	if (L->next == NULL) { 
		printf(NULL);
		return false;
	}
	//定义一个搜索指针,指向头节点的next
	LinkList p = L->next;	
	//一直遍历到尾指针的next为空为止(下面的输出只是为了适应PTA的常见输出格式)
	if (p != NULL) {
		printf("%d", p->data);
		p = p->next;
	}
	while (p!= NULL) {
		printf(" %d", p->data);
		p = p->next;
	}
	if (p == NULL) {
		printf("\n");
	}
	return true;
}

//获取链表长度
int len(LinkList L) {
	int length = 0;
	//定义一个搜索指针,指向头节点的next
	LinkList p = L->next;
	//一直遍历到尾指针的next为空为止
	while (p != NULL) {
		length++;
		p = p->next;
	}
	return length;
}

//根据索引获取元素
int getOfIndex(LinkList L,int index) {
	int element=NULL,i=0;
	if (L->next == NULL) return NULL;
	//定义一个搜索指针,指向头节点的next
	LinkList p = L->next;
	//一直遍历到尾指针的next为空为止
	while (p != NULL,i<index) {
		i++;
		p = p->next;
	}
	element = p->data;
	return element;
}

//插入方法
bool insert(LinkList L, int index,int num) {
	if (index < 1) return false;
	int element = NULL, i = 0;
	//定义一个搜索指针,指向头节点的next
	LinkList p = L->next;
	//一直遍历到尾指针的next为空为或者到到索引处止
	while (p != NULL, i < index-2) {
		i++;
		p = p->next;
	}
	//1先申请一块空间,用于存放新的数据
	LinkList newNode = (LinkList*)malloc(sizeof(LinkList));
	//2把要存放的数据放进去
	newNode->data = num;
	//新节点的next指向原来处在本位置的节点
	newNode->next = p->next;
	//前一个结点指向本节点
	p->next = newNode;
	return true;
}

//根据索引返回元素
int  getElement(LinkList L, int index) {
	int i = 0;
	//定义一个搜索指针,指向头节点的next
	LinkList p, q;
	p = q = L->next;
	//一直遍历到尾指针的next为空为或者到到索引处止
	while (p != NULL, i < index) {
		i++;
		p = p->next;
	}
	return p->data;
}
//删除元素的方法
//根据下标删除
bool deletOfIndex(LinkList L, int index) {
	int i = 0;
	//定义一个搜索指针,指向头节点的next
	LinkList p, q;
	p=q= L->next;
	//一直遍历到尾指针的next为空为或者到到索引处止
	while (p != NULL, i < index-1) {
		i++;
		p = p->next;
	}
	q = p->next;
	p->next= q->next;
}
//删除某元素
int deletOfElement(LinkList L, int num) {
	int i=0,index=0;
	//定义一个搜索指针,指向头节点的next
	LinkList p, q;
	p =q= L;
	if (p==NULL) {
		return false;
	}
	//遍历判断下一个元素是不是要删除的元素
	while (q->next != NULL) {
		q = q->next;
		if (q->data==num) {
			p->next = q->next;
			continue;
		}
		p = q;
	}
	return index;
}

int main()
{
    //在这里调用方法
}

2.PTA作业部分:

2.1:有序链表的归并

分数 10

全屏浏览题目

切换布局

分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个有序单链表,并依次输出合并后的单链表数据。

输入格式:

测试数据有多组,处理到文件尾。对于每组测试,第一行输入M与N的值;第二行依次输入M个有序的整数;第三行依次输入N个有序的整数。

输出格式:

对于每组测试,输出合并后的单链表所包含的M+N个有序的整数。

输入样例:

6 5
1 23 26 45 66 99
14 21 28 50 100
2 2
1 2
1 3

输出样例:

1 14 21 23 26 28 45 50 66 99 100
1 1 2 3

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct {
    int data;
    struct LNode* next;
}LNode, *LinkList;

LinkList newList() {
    LinkList List = (LinkList)malloc(sizeof(LinkList));
    List->next = NULL;
    return List;
}

bool displayAllElement(LinkList L) {
    if (L->next == NULL) { 
        return false;
    }
    LinkList p = L->next;
    if (p != NULL) {
        printf("%d", p->data);
        p = p->next;
    }
    while (p!= NULL) {
        printf(" %d", p->data);
        p = p->next;
    }
    if(p== NULL){
        printf("\n");
    }
    return true;
}

int append(LinkList L,int num) {
    LinkList newNode = (LinkList)malloc(sizeof(LinkList));
    newNode->data = num;
    newNode->next = NULL;
    LinkList tail;
    tail = L;
    while (tail->next!=NULL) {
        tail = tail->next;
    }
    tail->next = newNode;
    return num;
}

void function(int a,int b){
    LinkList list=newList();
    int temp;
    int c=a+b;
    int array[100];
    for(int j=0;j<c;j++){
        if(scanf("%d",&array[j]));
    }
    for(int i=0;i<c;i++){
        for(int k=0;k<c-i-1;k++){
            if(array[k]>array[k+1]){
                temp=array[k+1];
                array[k+1]=array[k];
                array[k]=temp;
            }
        }
    }
    for(int i=0;i<c;i++){
        append(list,array[i]);
    }
    displayAllElement(list);
}

#include<stdio.h>
int main()
{
    int a,b;
    while (scanf("%d %d", &a,&b)!=EOF)
    {
        function(a,b);
    }
return 0;
}

2.2两个递增链表的差集 - 人邮DS(C 第2版)线性表习题2(4)

分数 10

全屏浏览题目

切换布局

已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集C(即仅由在A中出现而不在B中出现的元素所构成的集合),并将差集C以同样的形式存储,同时返回该集合C的元素个数。

输入格式:

输入两组数据为元素递增的数组,并构成两个链表A和B。
每一组数据的第一行输入数组长度,第二行输入递增数组。

输出格式:

输出链表C表示的差集的长度和元素。

输入样例:

5
1 3 5 7 9
3
2 3 5

输出样例:

3
1 7 9

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct {
    int data;
    struct LNode* next;
}LNode, *LinkList;

LinkList newList() {
    LinkList List = (LinkList)malloc(sizeof(LinkList));
    List->next = NULL;
    return List;
}

int len(LinkList L) {
    int length = 0;
    LinkList p = L->next;
    while (p != NULL) {
        length++;
        p = p->next;
    }
    return length;
}

int  getElement(LinkList L, int index) {
    int i = 0;
    LinkList p, q;
    p = q = L->next;
    while (p != NULL&&i < index) {
        i++;
        p = p->next;
    }
    return p->data;
}

int append(LinkList L,int num) {
    LinkList newNode = (LinkList)malloc(sizeof(LinkList));
    newNode->data = num;
    newNode->next = NULL;
    LinkList tail;
    tail = L;
    while (tail->next!=NULL) {
        tail = tail->next;
    }
    tail->next = newNode;
    return num;
}


int displayAllElement(LinkList L) {
    int length = 0;
    if (L->next == NULL) { 
        return false;
    }
    LinkList p = L->next;
    if (p != NULL) {
        printf("%d", p->data);
        length++;
        p = p->next;
    }
    while (p!= NULL) {
        printf(" %d", p->data);
        length++;
        p = p->next;
    }
    if(p== NULL){
        printf("\n");
    }
    return length;
}

int main(){
    
    LinkList A=newList();
    LinkList B=newList();
    LinkList C=newList();
    int a,b,temp;
    if(scanf("%d",&a));
    for(int i=0;i<a;i++){
        if(scanf("%d",&temp));
        append(A,temp);
    }
    if(scanf("%d",&b));
    for(int i=0;i<b;i++){
        if(scanf("%d",&temp));
        append(B,temp);
    }

    int count=0;
    for(int i=0;i<a;i++){
        int first=getElement(A,i);
        for(int j=0;j<b;j++){
            int second=getElement(B,j);
            if(first!=second){
                    count++;
            }
        }
        if (count==b){
            append(C,first);
        }
        count=0;
    }
    printf("%d\n",len(C));
    displayAllElement(C);

    return 0;
}

2.3将单链表倒置,要求只利用原表的存储空间。

原单链表如下所示:

图片.png

倒置后的单链表应为:

1.png

输入格式:

第一行输入n的值,表示单链表的元素个数。
第二行输入n个整数值,作为单链表的各元素值。

输出格式:

输出倒置后的单链表的各元素值,各元素值之间用空格分隔。

输入样例1:

4
2 4 6 8

输出样例1:

8 6 4 2

输入样例2:

7
1 3 5 7 9 11 13

输出样例2:

13 11 9 7 5 3 1

4
2 4 6 8
8 6 4 2 

代码长度限制

16 KB

时间限制

400 ms

内存限制

16 MB

代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct {
    int data;
    struct LNode* next;
}LNode, *LinkList;

LinkList newList() {
    LinkList List = (LinkList)malloc(sizeof(LinkList));
    List->next = NULL;
    return List;
}
int  getElement(LinkList L, int index) {
    int i = 0;
    LinkList p, q;
    p = q = L->next;
    while (p != NULL&&i < index) {
        i++;
        p = p->next;
    }
    return p->data;
}

int append(LinkList L,int num) {
    LinkList newNode = (LinkList)malloc(sizeof(LinkList));
    newNode->data = num;
    newNode->next = NULL;
    LinkList tail;
    tail = L;
    while (tail->next!=NULL) {
        tail = tail->next;
    }
    tail->next = newNode;
    return num;
}
int main(){
    LinkList L=newList();
    int len,temp;
    if(scanf("%d",&len));
    int i=0;
    for(i;i<len;i++){
        if(scanf("%d",&temp));
        append(L,temp);
    }
    i--;
    for(i;i>=0;i--){
        printf("%d ",getElement(L,i));
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值