C语言——数据结构笔试题

image-20250506231344924

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

// 递增排序插入
void SeqList_Insert(SeqList *L, int x) {
    int temp = -1; // 记录待插入元素的下标
    
    // 遍历顺序表,找到插入位置,比较元素
    for (int i = 0; i <= last; ++i) {
        if (x < L[i]) {
            temp = i;
            break;
        }
    }

    if (-1 == temp) {
        L[last+1] = x;
        return;
    }
    
    // 把待插入位置的后继元素向后移动
    for (int i = last; i >= temp; i--) {
        L[i+1] = L[i];
    }

    L[temp] = x; // 插入当前位置
}

image-20250507000627363

删除顺序表工中下标为p(0<p<length-1)的元素,成功返回1,否则返回 0,并将被删除元素的值赋给 e。

int SeqList_Remove(*L, int p)
{
    // 判断L地址是否有效
    if( L == NULL )
    {
        return 0;
    }
    // 备份待删除元素的值到e中
    int e = L[p]
    // 把待删除元素的后继元素向前移动1单位
    for(int i = p;i < length;i++)
    {
        L[i] = L[i+1]
    }
    return 1;
}

image-20250507203003515

设计一个算法删除单链表L(有头结点)中的一个最小值结点

bool LinkedList_DelMinVal(LinkedList_t *head)
{
    // 判断链表是否为空(只有头结点)
    if (head == NULL || head->next == NULL)
    {
        return false;
    }
    
    LinkedList_t *prev = head;         // 当前结点的前驱
    LinkedList_t *current = head->next; // 当前结点
    LinkedList_t *minPrev = prev;      // 最小值结点的前驱
    LinkedList_t *minNode = current;   // 最小值结点

    // 遍历链表寻找最小值结点
    while (current != NULL)
    {
        if (current->data < minNode->data)  // 比较结点值
        {
            minNode = current;
            minPrev = prev;
        }
        prev = current;
        current yyyyyyent->next;
    }

    // 删除最小值结点
    minPrev->next = minNode->next;
    minNode = NULL;
    free(minNode);
    
    return true;
}

image-20250507201742142

1.已知一个带有表头结点的单链表,结点结构为:
datanext假设该链表只给出了头指针 head。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回 1:否则,只返回 0。

int findKthToLast(ListNode *head, int k) {
    // 判断链表是否为空(只有头结点)
    if (head == NULL || head->next == NULL) {
        return 0;
    }
    
    ListNode *p = head;  // 慢指针
    ListNode *q = head;  // 快指针
    
    // 快指针先移动k步
    for (int i = 0; i < k; i++) {
        if (q == NULL) {
            // 链表长度小于k
            return 0;
        }
        q = q->next;
    }
    
    // 同时移动两个指针
    while (q != NULL) {
        p = p->next;
        q = q->next;
    }
    
	 printf("倒数第%d个结点的data值为: %d\n", k, p->data);
     return 1;
}
posted @ 2025-05-07 20:32  九思0404  阅读(24)  评论(0)    收藏  举报