数据结构及单链表例题(下)

上次我们已经了解了单链表的数据结构定义以及创建单链表的两种方法,这节介绍几道例题.

文章目录

前言

一、已知L为带头结点的单链表,请依照递归思想实现下列运算

二、单链表访问第i个数据节点

三、在第i个元素前插入元素e

四、删除第i个结点

五、查找带头结点单链表倒数第m个结点并输出(m<链的长度)

六、设单链表表头指针为L,节点数据域为数字(0~9)(字符的思想一样),设计时间复杂度最低的算法判断前n/2个数字是否与后n/2数字一次相同(说人话就是是否前后一样)

 七、从非递减有序的单链表中删除值相同的多余元素

八、设有一个非递减正整数单链表(有重复数)设计算法确定比x小的节点数量

九、删除非递减单链表La中La与Lb相同元素(算法实现了但没验证)

十、已知La,Lb,Lc是三个链表,且他们已经初始化,其元素按递增顺序排序每个表中均无重复数据,设计算法在表Lc中,删除同时出现在La和Lb中的所有元素.(算法实现了但没验证)

十一、带头节点单链表中的所有元素的数据按递增顺序排列,删除链表中大于min且小于max的元素

十二、对链表进行冒泡排序

十三、设L为单链表头节点地址,其数据节点都是正整数可能存在相同的数值的节点,设计一个空间复杂度最低的算法利用直接插入排序把该链表按递增排序,并将重复点删除.

十四、给定两个单链表,编写算法找出两个链表的公共节点(算法实现没验证)

总代码与测试结果

总结


前言

这节课介绍的几道例题是考试中常考的大家应好好理解,我将注释写清楚点.单链表的数据结构定义与头插法和尾插法创建单链表在上节已经实现这节课主要做几道例题,但要想测试例题需要建立单链表,所以大家可以在最后的总代码和结果中查看.其中文章中备注的算法实现了但未验证不代表算法是错的,只是由于实现的前提条件比较困难.

一、已知L为带头结点的单链表,请依照递归思想实现下列运算

  1. 求链表中的最大整数
  2. 求表中的节点数
  3. 求链表所有元素的平均值

求链表中的最大整数

//(1)求链表中的最大整数
int getmax(Linklist L) {if (L == NULL) {return MIN;//宏定义MIN为一个很小的数例如-999999}int tmp = getmax(L->next);//获得下一个元素return tmp > L->data ? tmp : L->data;//比较两个元素大小
}

这道题要熟悉了解递归

求表中的节点数

//(2)求表中的节点数
int getnodes(Linklist L) {if (L == NULL) {return 0;//没有节点了返回0}return 1 + getnodes(L->next);//求和
}

求链表所有元素的平均值

//定义求链表所有元素之和函数
float sum(Linklist L) {//递归求和函数if (L == NULL) {return 0;}return L->data + sum(L->next);
}
void operation(Linklist L) {int max = getmax(L->next);//带头节点传入第一个数据域printf("链表中的最大值为:%d\n", max);int num = getnodes(L->next);//带头节点传入第一个数据域printf("链表中的节点个数为:%d\n", num);float sumnum = sum(L->next);printf("链表中元素的和为:%f\n", sumnum);float avg = sumnum / num;//总和除以总结点个数printf("链表元素的平均值为:%.4lf\n", avg);
}

二、单链表访问第i个数据节点

void getElem(Linklist L, int i, int& e) {int j = 0;//计数器LNode* p = L;while (NULL != p->next) {j++;if (j == i) {//到第i个节点将值赋给e返回e = p->next->data;break;}p = p->next;}
}

三、在第i个元素前插入元素e

//例5:在第i个元素前插入元素e
void insertElem(Linklist L, int i, int e) {int j = 0;LNode* p = L->next;LNode* pre = L;//前驱指针while (p != NULL) {j++;if (j == i) {LNode* pNode = (LNode*)malloc(sizeof(LNode));assert(pNode);pNode->data = e;pNode->next = pre->next;pre->next = pNode;break;}pre = p;p = p->next;}}

在单链表插入元素,需要找到插入位置元素的前驱.

核心代码

pNode->next = pre->next;
pre->next = pNode;

四、删除第i个结点

//删除第i个结点
void deleteElem(Linklist L, int i, int &e) {int j = 0;LNode* p = L->next;LNode* pre = L;while (p != NULL) {j++;if (j == i) {e = p->data;LNode* tmp = p;pre->next = p->next;//断链,删除元素的前驱节点指向删除节点的后驱free(tmp);//释放结点tmp = NULL;break;}pre = p;p = p->next;}
}

删除节点要释放节点使用free()

五、查找带头结点单链表倒数第m个结点并输出(m<链的长度)

//例6:查找带头结点单链表倒数第m个结点并输出(m<链的长度)
void getData(int m, Linklist L) {int j = 0;LNode* p = L->next;LNode* q = L->next;while (p != NULL) {j++;if (j == m) {break;}p = p->next;}if (p != NULL) {p = p->next;//指向下一个m+1个节点}while (p != NULL) {p = p->next;q = q->next;}if (q != NULL) {printf("倒数第%d个元素为:%d\n", m, q->data);}
}

查找倒数第m个节点挺常考的,但是也比较简单,知道思想问题就迎刃而解了.

算法思想:定义一个p指针和q指针同时指向首元素,使用指针p寻找第m+1个元素,这样就保证了p指针到q指针之间有m个元素,之后将p,q指针同时往后移这样当p指针为空时,q正好指向倒数第m个元素.

六、设单链表表头指针为L,节点数据域为数字(0~9)(字符的思想一样),设计时间复杂度最低的算法判断前n/2个数字是否与后n/2数字一次相同(说人话就是是否前后一样)

int isSym(Linklist L,int n) {int j = 0;LNode* p = L->next;LNode* q = L->next;while (p != NULL) {j++;if (j == n / 2) {break;}p = p->next;}if (n % 2 == 0) {//偶数移一位p = p->next;}else {//奇数移两位p = p->next->next;}while (p != NULL) {if (q->data != p->data) {return 0;}p = p->next;q = q->next;}return 1;
}

算法思想:前一半和后一半是否一样只需找到后一半的首元素,找到后只需将前一半与后一般元素一一比较即可.但中间有个细节就是链表的长度是奇数还是偶数,分情况讨论.这里我画个图方便大家理解.

 七、从非递减有序的单链表中删除值相同的多余元素

//例8:从非递减有序的单链表中删除值相同的多余元素
void deletesimilar(Linklist L) {LNode* preNode = L->next;while (preNode!=NULL && NULL != preNode->next) {if (preNode->next->data == preNode->data) {LNode* p = preNode->next;preNode->next = p->next;free(p);p = NULL;}else {preNode = preNode->next;}}
}

这道题也非常静经典.

算法思想:从非递减链表中删除重复元素只需遍历元素与前驱元素比较,如果相等就删除节点.大家只要知道思想代码就可以灵活多变.

八、设有一个非递减正整数单链表(有重复数)设计算法确定比x小的节点数量

//例9:设有一个非递减正整数单链表(有重复数)设计算法确定比x小的节点数量
//L:{1,2,2,2,4,6}比4小的节点有2个
int lessNodes(Linklist L, int x) {int i = 0;LNode* preCur = L;LNode* pCur = L->next;while (pCur != NULL && pCur->data < x) {if (pCur->data != preCur->data) {i++;}preCur = pCur;pCur = pCur->next;}return i;
}

这道题与上道题类似.

算法思想:非递减有重复数,查找比x节点有几个(去掉重复),遍历元素只要当前元素小于x且不等于前驱元素,也就是说出现了新的值,计数器i就++,最后返回i,这道题也就是上道题的变形,思想很重要,可以帮助你解决很多问题.

九、删除非递减单链表La中La与Lb相同元素(算法实现了但没验证)

//例10:删除非递减单链表La中La与Lb相同元素(算法实现了但没验证)
void delsimilar(Linklist La, Linklist Lb) {//在A表上进行修改LNode* preCurA = La;LNode* pCurA = La->next;LNode* pCurB = Lb->next;while (pCurA && pCurB) {if (pCurA->data < pCurB->data) {//说明与B相等元素在后面,移动A指针preCurA = pCurA;//因为在A表上修改记录前驱pCurA = pCurA->next;}else if (pCurA->data > pCurB->data) {说明与A相等元素在后面,移动B指针pCurB = pCurB->next;}else {//相等删除A中当前元素preCurA = pCurA->next;free(pCurA);pCurA = preCurA->next;}}
}

这道题也比较经典.

算法思想:LA非递减删除LB相同元素,设定两个指针p和q,p指向表A中元素,q指向表B中元素,如果有一方的当前指针指向的元素比另一方小则移动该链表的指针,因为如果想要找到相等的只能在后面元素里面找.

十、已知La,Lb,Lc是三个链表,且他们已经初始化,其元素按递增顺序排序每个表中均无重复数据,设计算法在表Lc中,删除同时出现在La和Lb中的所有元素.(算法实现了但没验证)

//例11:已知La,Lb,Lc是三个链表,且他们已经初始化,其元素按递增顺序排序每个表中均无重复数据,设计算法在表Lc中
//删除同时出现在La和Lb中的所有元素.(算法实现了但没验证)
void deleteOper(LNode*& preCur, LNode*& pCur, ElemType e) {while (NULL != pCur && pCur->data < e) {//找到第一个>=e的元素preCur = pCur;pCur = pCur->next;}if (pCur!=NULL && e == pCur->data) {//如果等于该元素删除preCur = pCur->next;free(pCur);pCur = preCur->next;}
}
void delsimilar2(Linklist La, Linklist Lb, Linklist Lc) {LNode* pCurA = La->next;LNode* pCurB = Lb->next;LNode* preCurC = Lc;LNode* pCurC = Lc->next;while (pCurA && pCurB) {//寻找LA与LB中相同的元素if (pCurA->data < pCurB->data) {pCurA = pCurA->next;}else if(pCurA->data > pCurB->data){pCurB = pCurB->next;}else {deleteOper(preCurC, pCurC, pCurA->data);pCurB = pCurB->next;pCurA = pCurA->next;}}
}

算法思想:这道题是上一道题的增强版,但是也是比较简单的,就是找LA与LB中相同的元素再去LC表中查找并删除即可.注意一个细节,由于不想从头开始找,所以Lc记录的前驱节点为引用传递,这其实是c++的语法,你可以改为指针,进行址传递,但考试时写伪代码即可.

十一、带头节点单链表中的所有元素的数据按递增顺序排列,删除链表中大于min且小于max的元素

//例12:带头节点单链表中的所有元素的数据按递增顺序排列,删除链表中大于min且小于max的元素
void deleteNodes(Linklist L,int min ,int max) {LNode* preCur = L;LNode* pCur = L->next;while (pCur) {//找到第一个大于min的节点if (min < pCur->data) {break;}preCur = pCur;pCur = pCur->next;}while (pCur && pCur->data < max) {//一直删除到大于maxpreCur->next = pCur->next;free(pCur);pCur = preCur->next;}
}

这个比较简单了遍历一次链表就可以了,但要记住删除单链表节点一定要记录前驱节点.

十二、对链表进行冒泡排序

//例13:对链表进行冒泡排序
void bubleSort(Linklist L) {while (1) {//每次都从第一个元素开始遇到大于的就交换int isExchange = 0;//记录是否元素发生交换LNode* p = L->next;while (p && p->next) {if (p->data > p->next->data) {//交换元素ElemType tmp = p->data;p->data = p->next->data;p->next->data = tmp;isExchange = 1;}p = p->next;}if (isExchange == 0) {//当前这一次排序没发生交换说明排序已经完成break;}}
}

算法思想:就是冒泡排序的思想这里不用交换节点直接交换数据即可.要注意与数组的冒泡排序不同由于链表在开始前无法知道元素个数,所以用while(1),结束条件就是当链表中不在发生交换说明排序以完成.后续我们在排序算法时还会提及.

十三、设L为单链表头节点地址,其数据节点都是正整数可能存在相同的数值的节点,设计一个空间复杂度最低的算法利用直接插入排序把该链表按递增排序,并将重复点删除.

//例14:设L为单链表头节点地址,其数据节点都是正整数可能存在相同的数值的节点,设计一个空间复杂度最低的算法利用直接插入排序
//把该链表按递增排序,并将重复点删除.
void insertsort(Linklist L) {LNode* p = L->next;//先把表提出来L->next = NULL;while (p != NULL) {LNode* preCur = L;LNode* pCur = L->next;while (pCur && pCur->data < p->data) {//寻找插入位置preCur = pCur;pCur = pCur->next;}LNode* tmp = p;//先记录元素节点p = p->next;//指针向后if (pCur!=NULL && pCur->data == tmp->data) {//如果第一个不小于该元素等于该元素删除节点free(tmp);tmp = NULL;}else {//插入节点tmp->next = preCur->next;preCur->next = tmp;}}
}

算法思想:采用直接插入排序,这里对直接插入排序不理解的直接跳过即可,这题主要一个思想就是对链表操作时可以将链表断开之后一个元素一个元素的进行操作.

十四、给定两个单链表,编写算法找出两个链表的公共节点(算法实现没验证)

//例15:给定两个单链表,编写算法找出两个链表的公共节点(算法实现没验证)
//定义求链表长度函数
int Length(Linklist L) {LNode* p = L->next;int length = 0;while (p!=NULL) {length++;p = p->next;}return length;
}
//寻找公共节点函数
//思想:公共节点只可能在短链的后面节点出现,故长链前的节点不用比较
LNode* search(Linklist La, Linklist Lb) {int Lalength = Length(La);int Lblength = Length(Lb);int dist = 0;LNode* shortlist = NULL;LNode* longlist = NULL;if (Lalength > Lblength) {longlist = La->next;shortlist = Lb->next;dist = Lalength - Lblength;}else {longlist = Lb->next;shortlist = La->next;dist = Lblength - Lalength;}while (dist--) {//寻找可能出现公共节点的第一个节点longlist = longlist->next;}while (longlist!=NULL) {//节点依次比较if (longlist == shortlist) {return longlist;}else {longlist = longlist->next;shortlist = shortlist->next;}}return NULL;
}

这道题王道辅导书上的课后题也有.

算法思想:要寻找两个链表的公共节点,第一个公共节点只能在长链中长链长度减短链长度之后.这里简单画个图帮助大家理解.

总代码与测试结果

测试结果有标注对应好.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<malloc.h>#define MIN -999999;
typedef int ElemType;//单链表的数据结构定义
typedef struct LNode {ElemType data;//数据struct LNode* next;//下一个节点
}LNode,*Linklist;
//使用头插法建立单链表
void CreateLinklist1(Linklist &L,int arr[],int arrlength) {L = (LNode*)malloc(sizeof(LNode));//申请一个头节点assert(L);L->next = NULL;for (int i = 0; i < arrlength; i++) {LNode*pNode = (LNode*)malloc(sizeof(LNode));assert(pNode);pNode->data = arr[i];pNode->next = L->next;L->next = pNode;}
}
//使用尾插法建立单链表
void CreateLinklist2(Linklist& L,int arr[],int arrlength) {L = (LNode*)malloc(sizeof(LNode));//申请一个头节点assert(L);L->next = NULL;LNode* pTail = L;for (int i = 0; i < arrlength; i++) {LNode* pNode = (LNode*)malloc(sizeof(LNode));assert(pNode);pNode->data = arr[i];pNode->next = pTail->next;pTail->next = pNode;pTail = pNode;}
}
//打印单链表函数
void print(Linklist L) {LNode* p = L->next;while (NULL != p) {printf("%d ", p->data);p = p->next;}printf("\n");
}
//例3:已知L为带头结点的单链表,请依照递归思想实现下列运算
//(1)求链表中的最大整数
int getmax(Linklist L) {if (L == NULL) {return MIN;}int tmp = getmax(L->next);return tmp > L->data ? tmp : L->data;
}
//(2)求表中的节点数
int getnodes(Linklist L) {if (L == NULL) {return 0;}return 1 + getnodes(L->next);
}
//(3)求链表所有元素的平均值
//定义求链表所有元素之和函数
float sum(Linklist L) {if (L == NULL) {return 0;}return L->data + sum(L->next);
}
void operation(Linklist L) {int max = getmax(L->next);//带头节点传入第一个数据域printf("链表中的最大值为:%d\n", max);int num = getnodes(L->next);//带头节点传入第一个数据域printf("链表中的节点个数为:%d\n", num);float sumnum = sum(L->next);printf("链表中元素的和为:%f\n", sumnum);float avg = sumnum / num;printf("链表元素的平均值为:%.4lf\n", avg);
}
//例4:单链表访问第i个数据节点
void getElem(Linklist L, int i, int& e) {int j = 0;LNode* p = L;while (NULL != p->next) {j++;if (j == i) {e = p->next->data;break;}p = p->next;}
}
//例5:在第i个元素前插入元素e
void insertElem(Linklist L, int i, int e) {int j = 0;LNode* p = L->next;LNode* pre = L;while (p != NULL) {j++;if (j == i) {LNode* pNode = (LNode*)malloc(sizeof(LNode));assert(pNode);pNode->data = e;pNode->next = pre->next;pre->next = pNode;break;}pre = p;p = p->next;}}
//删除第i个结点
void deleteElem(Linklist L, int i, int &e) {int j = 0;LNode* p = L->next;LNode* pre = L;while (p != NULL) {j++;if (j == i) {e = p->data;LNode* tmp = p;pre->next = p->next;//断链free(tmp);//释放结点tmp = NULL;break;}pre = p;p = p->next;}
}
//例6:查找带头结点单链表倒数第m个结点并输出
void getData(int m, Linklist L) {int j = 0;LNode* p = L->next;LNode* q = L->next;while (p != NULL) {j++;if (j == m) {break;}p = p->next;}if (p != NULL) {p = p->next;//指向下一个m+1个节点}while (p != NULL) {p = p->next;q = q->next;}if (q != NULL) {printf("倒数第%d个元素为:%d\n", m, q->data);}
}
//例7:设单链表表头指针为L,节点数据域为数字(0~9)(字符的思想一样),设计时间复杂度最低的算法判断前n/2
//个数字是否与后n/2数字一次相同(说人话就是是否前后一样)
int isSym(Linklist L,int n) {int j = 0;LNode* p = L->next;LNode* q = L->next;while (p != NULL) {j++;if (j == n / 2) {break;}p = p->next;}if (n % 2 == 0) {p = p->next;}else {p = p->next->next;}while (p != NULL) {if (q->data != p->data) {return 0;}p = p->next;q = q->next;}return 1;
}
//例8:从非递减有序的单链表中删除值相同的多余元素
void deletesimilar(Linklist L) {LNode* preNode = L->next;while (preNode!=NULL && NULL != preNode->next) {if (preNode->next->data == preNode->data) {LNode* p = preNode->next;preNode->next = p->next;free(p);p = NULL;}else {preNode = preNode->next;}}
}
//例9:设有一个非递减正整数单链表(有重复数)设计算法确定比x小的节点数量
//L:{1,2,2,2,4,6}比4小的节点有2个
int lessNodes(Linklist L, int x) {int i = 0;LNode* preCur = L;LNode* pCur = L->next;while (pCur != NULL && pCur->data < x) {if (pCur->data != preCur->data) {i++;}preCur = pCur;pCur = pCur->next;}return i;
}
//例10:删除非递减单链表La中La与Lb相同元素(算法实现了但没验证)
void delsimilar(Linklist La, Linklist Lb) {LNode* preCurA = La;LNode* pCurA = La->next;LNode* pCurB = Lb->next;while (pCurA && pCurB) {if (pCurA->data < pCurB->data) {preCurA = pCurA;pCurA = pCurA->next;}else if (pCurA->data > pCurB->data) {pCurB = pCurB->next;}else {preCurA = pCurA->next;free(pCurA);pCurA = preCurA->next;}}
}
//例11:已知La,Lb,Lc是三个链表,且他们已经初始化,其元素按递增顺序排序每个表中均无重复数据,设计算法在表Lc中
//删除同时出现在La和Lb中的所有元素.(算法实现了但没验证)
void deleteOper(LNode*& preCur, LNode*& pCur, ElemType e) {while (NULL != pCur && pCur->data < e) {preCur = pCur;pCur = pCur->next;}if (pCur!=NULL && e == pCur->data) {preCur = pCur->next;free(pCur);pCur = preCur->next;}
}
void delsimilar2(Linklist La, Linklist Lb, Linklist Lc) {LNode* pCurA = La->next;LNode* pCurB = Lb->next;LNode* preCurC = Lc;LNode* pCurC = Lc->next;while (pCurA && pCurB) {if (pCurA->data < pCurB->data) {pCurA = pCurA->next;}else if(pCurA->data > pCurB->data){pCurB = pCurB->next;}else {deleteOper(preCurC, pCurC, pCurA->data);pCurB = pCurB->next;pCurA = pCurA->next;}}
}
//例12:带头节点单链表中的所有元素的数据按递增顺序排列,删除链表中大于min且小于max的元素
void deleteNodes(Linklist L,int min ,int max) {LNode* preCur = L;LNode* pCur = L->next;while (pCur) {//找到第一个大于min的节点if (min < pCur->data) {break;}preCur = pCur;pCur = pCur->next;}while (pCur && pCur->data < max) {//一直删除到大于maxpreCur->next = pCur->next;free(pCur);pCur = preCur->next;}
}
//例13:对链表进行冒泡排序
void bubleSort(Linklist L) {while (1) {//每次都从第一个元素开始遇到大于的就交换int isExchange = 0;LNode* p = L->next;while (p && p->next) {if (p->data > p->next->data) {ElemType tmp = p->data;p->data = p->next->data;p->next->data = tmp;isExchange = 1;}p = p->next;}if (isExchange == 0) {break;}}
}
//例14:设L为单链表头节点地址,其数据节点都是正整数可能存在相同的数值的节点,设计一个空间复杂度最低的算法利用直接插入排序
//把该链表按递增排序,并将重复点删除.
void insertsort(Linklist L) {LNode* p = L->next;L->next = NULL;while (p != NULL) {LNode* preCur = L;LNode* pCur = L->next;while (pCur && pCur->data < p->data) {//寻找插入位置preCur = pCur;pCur = pCur->next;}LNode* tmp = p;p = p->next;if (pCur!=NULL && pCur->data == tmp->data) {//如果第一个不小于该元素等于该元素删除节点free(tmp);tmp = NULL;}else {//插入节点tmp->next = preCur->next;preCur->next = tmp;}}
}
//例15:给定两个单链表,编写算法找出两个链表的公共节点(算法实现没验证)
//定义求链表长度函数
int Length(Linklist L) {LNode* p = L->next;int length = 0;while (p!=NULL) {length++;p = p->next;}return length;
}
//寻找公共节点函数
//思想:公共节点只可能在短链的后面节点出现,故长链前的节点不用比较
LNode* search(Linklist La, Linklist Lb) {int Lalength = Length(La);int Lblength = Length(Lb);int dist = 0;LNode* shortlist = NULL;LNode* longlist = NULL;if (Lalength > Lblength) {longlist = La->next;shortlist = Lb->next;dist = Lalength - Lblength;}else {longlist = Lb->next;shortlist = La->next;dist = Lblength - Lalength;}while (dist--) {//寻找可能出现公共节点的第一个节点longlist = longlist->next;}while (longlist!=NULL) {//节点依次比较if (longlist == shortlist) {return longlist;}else {longlist = longlist->next;shortlist = shortlist->next;}}return NULL;
}
int main() {Linklist L=NULL;int arr[10] = { 1,50,88,49,66,13,12,17,19,44 };int arrlength = sizeof(arr) / sizeof(arr[0]);//使用头插法建立单链表CreateLinklist2(L, arr, arrlength);printf("输出尾插法链中序列L:");print(L);printf("**************************************\n");printf("对例3进行测试!\n");operation(L);printf("**************************************\n");printf("对例4进行测试!\n");int e = 0;getElem(L, 4, e);printf("e的值为:%d\n", e);int a = 777;printf("**************************************\n");printf("对例5进行测试!\n");insertElem(L, 4, a);print(L);printf("删除第i个节点!\n");int b = 0;deleteElem(L, 4, b);printf("b的值为:%d\n", b);print(L);printf("**************************************\n");printf("对例6进行测试!\n");getData(4,L);printf("**************************************\n");printf("对例7进行测试!\n");Linklist La;int arr1[11] = { 1,2,3,4,5,6,1,2,3,4,5 };int arrlength1 = sizeof(arr1) / sizeof(arr1[0]);//使用头插法建立单链表CreateLinklist2(La, arr1, arrlength1);print(La);printf("判断单链表是否对称(是返回1不是为0):%d\n", isSym(La, 11));printf("**************************************\n");printf("对例8进行测试!\n");Linklist Lb;int arr2[10] = { 1,1,2,2,3,3,4,4,5,6};int arrlength2 = sizeof(arr2) / sizeof(arr2[0]);//使用头插法建立单链表CreateLinklist2(Lb, arr2, arrlength2);printf("删除前:");print(Lb);deletesimilar(Lb);printf("删除后:");print(Lb);printf("**************************************\n");printf("对例9进行测试!\n");CreateLinklist2(Lb, arr2, arrlength2);printf("比4小的节点个数为:%d\n", lessNodes(Lb, 4));printf("**************************************\n");printf("对例12进行测试!\n");print(Lb);deleteNodes(Lb,2,6);print(Lb);printf("**************************************\n");printf("对例13进行测试!\n");print(L);bubleSort(L);print(L);printf("**************************************\n");printf("对例14进行测试!\n");CreateLinklist2(L, arr, arrlength);print(L);insertsort(L);print(L);printf("**************************************\n");printf("对例15进行测试!\n");printf("链表长度为:%d",Length(L));return 0;
}


总结

几道关于单链表的题目,希望可以帮助大家,本人制作不易,麻烦点点赞,谢谢家人们.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TS 36.322 V12.0.0-过程

​本文的内容主要涉及TS 36.322&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

构建安全可靠的系统:第十一章到第十五章

第三部分&#xff1a;实现系统 原文&#xff1a;Part III. Implementing Systems 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一旦您分析并设计了您的系统&#xff0c;就该是实现计划的时候了。在某些情况下&#xff0c;实现可能意味着购买现成的解决方案。第十一章…

QT第1天

题目&#xff1a;点击按钮改变文字 需要增加一个count属性&#xff0c;并且只需要定义槽&#xff0c;信号函数已经内置好了 //widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

[C++]多态

目录 C多态&#xff1a;&#xff1a; 多态的概念 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 虚函数重写的特例 C11 override和final 重载、重写重定义的对比 抽象类 概念 接口继承和实现继承 多态的原理 虚函数表 多态的原理 动态绑定和静态绑定 单继承和…

LeetCode 84:柱状图中的最大矩形

一、题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a…

Jmeter+ant+Jenkins 接口自动化框架完整版

接口自动化测试单有脚本是不够的&#xff0c;我们还需要批量跑指定接口&#xff0c;生成接口运行报告&#xff0c;定位报错接口&#xff0c;接口定时任务&#xff0c;邮件通知等功能。批量跑指定接口&#xff1a;我们可以利用ant批量跑指定目录下的Jmeter脚本生成接口运行报告&…

vue3基础类型和引用类型,和store的使用

案例一&#xff1a; 如果我在store创建一个变量&#xff0c;是读取缓存key为name的数据&#xff0c; store.name 默认值是张三 # 声明一个变量 const title ref(store.name) # 然后修改title.value "李四"&#xff0c; # 问&#xff1a;打印store.name&#xff0…

怎么投稿各大媒体网站?

怎么投稿各大媒体网站&#xff1f;这是很多写作者及自媒体从业者经常面临的问题。在信息爆炸的时代&#xff0c;如何将自己的文章推送到广大读者面前&#xff0c;成为了一个不可避免的挑战。本文将为大家介绍一种简单有效的投稿方法——媒介库发稿平台发稿&#xff0c;帮助大家…

5,sharding-jdbc入门-sharding-jdbc广播表

执行sql #在数据库 user_db、order_db_1、order_db_2中均要建表 CREATE TABLE t_dict (dict_id BIGINT (20) NOT NULL COMMENT 字典id,type VARCHAR (50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 字典类型,code VARCHAR (50) CHARACTER SET utf8 COLLAT…

国产AI工具钉钉AI助理:开启个性化助手服务的新篇章

钉钉AI助理是钉钉平台的一项功能&#xff0c;它可以根据用户的需求提供个性化的AI助手服务。用户可以在AI助理页面一键创建个性化的AI助理&#xff0c;如个人的工作AI助理、旅游AI助理、资讯AI助理等。企业也可以充分使用企业所沉淀的知识库和业务数据&#xff0c;在获得授权后…

C#入门篇(一)

变量 顾名思义就是变化的容器&#xff0c;即可以用来存放各种不同类型数值的一个容器 折叠代码 第一步&#xff1a;#region 第二步&#xff1a;按tab键 14种数据类型 有符号的数据类型 sbyte&#xff1a;-128~127 short&#xff1a;-32768~32767 int&#xff1a;-21亿多~21亿多…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

封装动画函数

文章目录 需求分析确定参数确定属性值具体实现简单扩展 需求分析 在 css 中&#xff0c;如果要给一个元素设置动画&#xff0c;就要改变一个css属性&#xff0c;也是一个值到另外一个值的变化&#xff0c;但是放入到我们这里的动画函数里面&#xff0c;我是不知道是具体要用到…

STK 特定问题建模(五)频谱分析(第二部分)

文章目录 简介三、链路分析3.1 星地链路干扰分析3.2 频谱分析 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分开展&#xff1a; 1、GEO星地通信收发机…

Java接口的解析

在 Java 中&#xff0c;接口&#xff08;Interface&#xff09;是一种抽象类型&#xff0c;用于定义一组相关方法的契约。接口只包含方法的签名&#xff0c;而没有方法的实现。实现接口的类必须提供接口中定义的方法的具体实现。 以下是对 Java 接口的解析&#xff1a; 这只是…

使用Scikit Learn 进行识别手写数字

使用Scikit Learn 进行识别手写数字 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f…

MySql -数据库进阶

一、约束 1.外键约束 外键约束概念 让表和表之间产生关系&#xff0c;从而保证数据的准确性&#xff01; 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数据库 USE db2;-- 创建user用户表 CREATE TABLE USER(id INT PRIMARY KEY …

2024-01-09 Android.mk 根据c文件名插入特定的宏定义,我这里用于定义log LOG_TAG 标签

一、在Android的构建系统中&#xff0c;使用Android.mk构建脚本可以根据特定需求来定义宏。如果你想根据C文件的名称来插入特定的宏定义&#xff0c;可以使用条件语句检查文件名&#xff0c;并相应地设置宏。 在Android的构建系统中&#xff0c;使用Android.mk构建脚本可以根据…

【MySQL】表设计与范式设计

文章目录 一、数据库表设计一对一一对多多对多 二、范式设计第一范式第二范式第三范式BC范式第四范式 一、数据库表设计 一对一 举个例子&#xff0c;比如这里有两张表&#xff0c;用户User表 和 身份信息Info表。 因为一个用户只能有一个身份信息&#xff0c;所以User表和In…

jmeter+ant+Jenkins集成

一、 环境准备 1、Jenkins下载&#xff1a;https://jenkins.io/zh/download/ 2、 Jenkins安装&#xff1a;解压下载的压缩包&#xff0c;直接点击msi文件安装即可 4、 Jenkins登录用户设置&#xff1a;装&#xff1a; 浏览器地址栏中输入&#xff1a;http://localhost:8080/…