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

已知一个顺序表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; // 插入当前位置
}

删除顺序表工中下标为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;
}

设计一个算法删除单链表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;
}

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;
}

浙公网安备 33010602011771号