PTA:C课程设计(6)

山东大学(威海)2022级大一下C习题集(6)

  • 函数题
    • 6-6-1 求单链表的表长
    • 6-6-2 求单链表元素序号
    • 6-6-3 求单链表结点的阶乘和
    • 6-6-4 逆序数据建立链表
  • 编程题
    • 6-7-1 单链表的创建及遍历

函数题

6-6-1 求单链表的表长

实现一个函数,求带头结点的单链表的表长
接口:

int Length ( LinkList L );

其中LinkList结构定义如下:

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

实现:

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

6-6-2 求单链表元素序号

接口:

int Locate ( LinkList L, ElemType e);

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

int Locate ( LinkList L, ElemType e)
{
    int n = 1;
    LinkList cur = L->next;
    while(cur)
    {
        if(cur->data == e)
            return n;
        n++;
        cur = cur->next;
    }
    return 0;
}

6-6-3 求单链表结点的阶乘和

本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。
接口:

int FactorialSum( List L );

其中单链表List的定义如下:

typedef struct Node *PtrToNode;
struct Node {
    int Data; /* 存储结点数据 */
    PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

实现:

int factorial(int data)
{
    if (data == 0)
        return 1;
    else
    {
        int ret = data;
        while (--data)
        {
            ret *= data;
        }
        return ret;
    }
}
int FactorialSum( List L )
{
    if(L==NULL)
        return 0;
    int ret = 0;
    List cur = L;
    while(cur)
    {
        ret += factorial(cur->Data);
        cur = cur->Next;
    }
    return ret;
}

6-6-4 逆序数据建立链表

实现一个函数,按输入数据的逆序建立一个链表。
接口:

struct ListNode *createlist();

函数createlist利用scanf从输入中获取一系列正整数,当读到−1时表示输入结束。按输入数据的逆序建立一个链表,并返回链表头指针。链表节点结构定义如下:

struct ListNode {
    int data;
    struct ListNode *next;
};

可以直接头插,这里为了多写一个反转链表,特意搞了尾插再反转
实现:

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* newhead = NULL, * cur = head;
    while (cur)
    {
        struct ListNode* next = cur->next;
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;
}
struct ListNode* BuySLTNode(int x)
{
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->data = x;
    newnode->next = NULL;

    return newnode;
}
void SLTPushBack(struct ListNode** pphead, int x)
{
    struct ListNode* newnode = BuySLTNode(x);
    if (*pphead == NULL)
    {
        *pphead = newnode;
    }
    else
    {
        struct ListNode* tail = *pphead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }
        tail->next = newnode;
    }
}
struct ListNode* createlist()
{
    struct ListNode* head = NULL;
    int n = 0;
    while (1)
    {
        scanf("%d", &n);
        if (n == -1)
            break;
        SLTPushBack(&head, n);
    }
    struct ListNode* ret = reverseList(head);
    return ret;
}

编程题

6-7-1 单链表的创建及遍历

PTA:C课程设计(6)_第1张图片

#include
#include

typedef struct ListNode
{
    int data;
    struct ListNode* next;
}ListNode;

ListNode* BuySLTNode(int x)
{
    ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->data = x;
    newnode->next = NULL;

    return newnode;
}
void SLTPushBack(ListNode** pphead, int x)
{
    ListNode* newnode = BuySLTNode(x);
    if (*pphead == NULL)
    {
        *pphead = newnode;
    }
    else
    {
        ListNode* tail = *pphead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }
        tail->next = newnode;
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    if(n == 0)
        return 0;
    ListNode* head = NULL;
    while (n--)
    {
        int c = 0;
        scanf("%d", &c);
        SLTPushBack(&head, c);
    }
    ListNode* cur = head;
    printf("%d", cur->data);
    cur = cur->next;
    while (cur)
    {
        printf(" %d", cur->data);
        cur = cur->next;
    }
    return 0;
}

你可能感兴趣的:(PTA大一下习题集,c语言,链表,学习,数据结构,算法)