PTA 2023-2024-1-数据结构练习题重现(单链表)

6-7 单链表遍历

本题要求实现一个函数,输出带头结点的单链表的的所有结点元素值。

函数接口定义:

void Traverse ( LinkList L );

其中LinkList结构定义如下:

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

L是带头结点的单链表的头指针。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

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

LinkList Create ();/* 细节在此不表 */
void Traverse ( LinkList L );
int main()
{
    LinkList L = Create();
    Traverse(L);
    return 0;
}


/* 请在这里填写答案 */

输入样例:

输入是以-1结束的整数序列,-1不属于单链表元素,整数之间空格分隔。

2 1 4 5 3 -1

输出样例:

输出单链表所有元素,格式为每个整数后面跟一个空格。

2 1 4 5 3 

 代码示例:

void Traverse ( LinkList L ){
    LinkList p = L->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
}

6-8 求单链表的表长

本题要求实现一个函数,求带头结点的单链表的表长。

函数接口定义:

int Length ( LinkList L );

其中LinkList结构定义如下:

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

L是带头结点的单链表的头指针,函数Length返回单链表的长度。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

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

LinkList Create();/* 细节在此不表 */

int Length ( LinkList L );

int main()
{
    LinkList L = Create();
    printf("%d\n", Length(L));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 4 5 3 -1

输出样例: 

5

代码示例: 

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

6-9 求单链表元素序号

本题要求实现一个函数,求带头结点的单链表中元素序号。

函数接口定义:

int Locate ( LinkList L, ElemType e);

L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

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

LinkList Create();/* 细节在此不表 */

int Locate ( LinkList L, ElemType e);

int main()
{
    ElemType e;
    LinkList L = Create();
    scanf("%d",&e);
    printf("%d\n", Locate(L,e));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 4 5 3 -1
5

输出样例: 

4

代码示例:

int Locate ( LinkList L, ElemType e){
    LinkList p = L->next;
    if(!p) return 0;
    int num = 0;
    while(p){
        num++;
        if(p->data==e)
            return num;
        p = p->next;
    }
    return 0;
}

 6-10 统计单链表元素出现次数

本题要求实现一个函数,统计带头结点的单链表中某个元素出现的次数。

函数接口定义:

int GetCount ( LinkList L,ElemType e );

L是带头结点的单链表的头指针,e是要统计次数的元素值。如果e在单链表中存在,函数GetCount返回其出现的次数;否则,返回0。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

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

LinkList Create();/* 细节在此不表 */

int GetCount ( LinkList L, ElemType e);

int main()
{
    ElemType e;
    LinkList L = Create();
    scanf("%d",&e);
    printf("%d\n", GetCount(L,e));
    return 0;
}
LinkList Create()
{
    LinkList L,r,p;
    ElemType e;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    r = L;
    scanf("%d",&e);
    while(e!=-1)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->data = e;
        p->next = r->next;
        r->next = p;
        r = p;
        scanf("%d",&e);
    }
    return L;
}

/* 你的代码将被嵌在这里 */

输入样例1:

2 2 4 2 3 -1
2

输出样例1: 

3

代码示例:

int GetCount ( LinkList L,ElemType e ){
    LinkList p = L->next;
    if(!p) return 0;
    int count = 0;
    while(p){
        if(p->data==e)
            count++;
        p = p->next;
    }
    return count;
}

 6-11 带头结点的单链表就地逆置

本题要求实现一个函数,对带有头结点的单链表进行就地逆置。

函数接口定义:

void  reverse ( LinkList L );

L是带头结点的单链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void reverse ( LinkList L);
int main()
{
    LinkList L = Create();
    print(L);
    printf("\n");
    reverse(L);
    print(L);
    return 0;
}
LinkList Create()
{
    LinkList L,p,s;
    ElemType e;
    L = (LinkList)malloc(sizeof(LNode));
    p=L;
    scanf("%d",&e);
    while(e!=-1)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data=e;
        p->next = s;
        p=s; 
        scanf("%d",&e);
    }
    p->next=NULL;
    return L;
}
void print(LinkList L)
{ 
     LinkList p;
     p=L->next;
     while (p)
    {
         printf("%d ", p->data);
         p =p->next;
    }
}
/* 请在这里填写答案 */

输入样例:

1 2 3 4 5 6 -1

输出样例: 

1 2 3 4 5 6 
6 5 4 3 2 1 

代码示例: 

void  reverse ( LinkList L ){
    LinkList p=NULL;
    LinkList c=L->next;
    LinkList nextNode = NULL;
    while(c){
        nextNode=c->next;
        c->next=p;
        p=c;
        c=nextNode;
    }
    L->next=p;
}

 6-12 带头结点的单链表插入操作

本题要求实现带头结点的单链表插入操作,插入成功返回1,否则返回0。

函数接口定义:

int insert_link ( LinkList L,int i,ElemType e);

L是单链表的头指针,i为插入位置,e是插入的数据元素,插入成功返回1,否则返回0。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

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

LinkList Create();/* 细节在此不表 */
void print( LinkList L);
int insert_link ( LinkList L,int i,ElemType e);
 
int main()
{
    int position,insert_data;int flag;
    LinkList L = Create();
    scanf("%d",&position);
    scanf("%d",&insert_data);    
    flag=insert_link(L,position,insert_data);
    if(flag) 
    {
        print(L);
    }
    else 
    { 
        printf("Wrong Position for Insertion");
    }
    return 0;
}
void print(LinkList L)
{ 
    LinkList p;
    p=L->next;
    while (p)
    {
         printf("%d ", p->data);
         p =p->next;
    }
}
/* 请在这里填写答案 */

输入格式:

输入数据为三行,第一行是若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
第二行数据是插入位置,第三行数据是被插入元素值。

输入样例:

1 2 3 4 5 6 -1

100

输出样例: 

1 100 2 3 4 5 6 

代码示例: 

int insert_link ( LinkList L,int i,ElemType e){
    LinkList p = L;
    if(!p) return 0;
    int c = 0;
    LinkList Node = (LinkList)malloc(sizeof(LNode));
    while(p){
        c++;
        if(c == i){
            Node->data = e;
            Node->next = p->next;
            p->next = Node;
            return 1;
        }
        p = p->next;
    }
    return 0;
}

6-7 带头结点的单链表删除操作

本题要求实现删除单链表的第i个元素结点,删除成功返回1,否则返回0。

函数接口定义:

int delete_link ( LinkList L,int i);

L为单链表的头指针,i为删除结点的序号。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

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

LinkList Create();/* 细节在此不表 */
void print( LinkList L);
int delete_link ( LinkList L,int i);
 
int main()
{
    
    LinkList L = Create();
    int position;int flag;
    scanf("%d",&position);
    flag=delete_link(L,position);
    if(flag) 
    {
        print(L);
    }
    else 
    { 
        printf("Wrong Position for Deletion");
    }
    return 0;
}
void print(LinkList L)
{ 
    LinkList p;
    p=L->next;
    while (p)
    {
        printf("%d ", p->data);
        p =p->next;
    }
}

/* 请在这里填写答案 */

输入格式:

输入数据为两行,第一行是若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
第二行数据是删除位置。

输入样例:

1 2 3 4 5 6 -1
3

输出样例: 

1 2 4 5 6 

代码示例: 

int delete_link ( LinkList L,int i){
    LinkList p = L;
    if(!p||i<1) return 0;
    int c = 0;
    while(p->next){
        c++;
        if(c == i){
            p->next = p->next->next;
            return 1;
        }
        p = p->next;
    }
    return 0;
}

6-8 在带头结点的单链表表尾处插入一个新元素

本题要求实现一个函数,在带头结点的单链表表尾处插入一个新元素e。

函数接口定义:

void insert ( LinkList L,ElemType e);

L是单链表的头指针,e是插入的数据元素。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void insert ( LinkList L,ElemType e);
int main()
{
    
        int e;
        LinkList L = Create();
        print(L);
        printf("\n");
        scanf("%d",&e);
        insert(L,e);
        print(L);
    
    
    return 0;
}
LinkList Create()
{
    LinkList L,p,s;
    ElemType e;
    L = (LinkList)malloc(sizeof(LNode));
    p=L;
    scanf("%d",&e);
    while(e!=-1)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data=e;
        p->next = s;
        p=s;
        scanf("%d",&e);
    }
    p->next=NULL;
    return L;
}
void print(LinkList L)
{ 
    LinkList p;
    p=L->next;
    while (p)
    {
        printf("%d ", p->data);
        p =p->next;
    }
}
/* 请在这里填写答案 */

输入样例:

1 2 3 4 5 6 -1 100

输出样例: 

1 2 3 4 5 6 
1 2 3 4 5 6 100 

代码示例: 

void insert ( LinkList L,ElemType e){
    LinkList p = L;
    LinkList s = (LinkList)malloc(sizeof(LNode));
    if(!p){
        L->next = s;
        s->next = NULL;
        s->data = e;
    }
    while(p->next){
        p = p->next;
    }
    s->next = p->next;
    p->next = s;
    s->data = e;
}

6-9 删除非空单链表的表尾元素

本题要求实现一个函数,删除带头结点的非空单链表的表尾元素。

函数接口定义:

void deletetail ( LinkList L);

L是单链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void deletetail ( LinkList L);
int main()
{
    
    LinkList L = Create();
    print(L);
    printf("\n");
    deletetail(L);
    print(L);
    return 0;
}
LinkList Create()
{
    LinkList L,p,s;
    ElemType e;
    L = (LinkList)malloc(sizeof(LNode));
    p=L;
    scanf("%d",&e);
    while(e!=-1)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data=e;
        p->next = s;
        p=s;
        scanf("%d",&e);
    }
    p->next=NULL;
    return L;
}
void print(LinkList L)
{ 
    LinkList p;
    p=L->next;
    while (p)
    {
         printf("%d ", p->data);
         p =p->next;
    }
}
/* 请在这里填写答案 */

输入样例:

18  299 -1

输出样例: 

18 299 
18 

代码示例:

void deletetail ( LinkList L){
    LinkList p = L->next;
    if(!p->next){
        L->next = p->next;
        free(p);
    }
    while(p->next->next){
        p = p->next;
    }
    p->next = NULL;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值