单链表的基本操作都学到手了,代码都敲得滚瓜烂熟了甚至敲到发霉,可就是不知道怎么用?那就练练!不就是几道题吗?题虽简单,用处却不小,至少让你明白了单链表的基本操作可以玩的这样6,脱离了之前的那些写好的现成的函数,代码可就长上加长了......直接上题,贴代码注释好无聊啊......没办法,学习应用就是这样,仔细看看琢磨琢磨其实也挺有趣。人一旦和一个东西呆一起久了,基本上都会产生感情,希望大家对代码也会产生这样微妙的感情吧!
1.设计一个算法,查找非空单链表L中的数据是最小的结点,并返回该结点的序号。
int FindMinIndex(LinkNode* L){//寻找单链表中最小元素的逻辑下标。
LinkNode* p=L->next;//定义一个指针指向首结点。
int min=p->data;//定义min变量并初始化为链表首结点的数据域的值。
while(p->next){//当p结点的指针域不为空时进入循环。
p=p->next;//指针p指向下一个结点。
if(p->data<min)//作比较并用min记录遍历到当前位置的最小值。
min=p->data;
}
return LocateElem(L,min);//通过已经找到的值用单链表的基本操作函数求出该最小值的逻辑位置。
}
2.设计一个算法,删除非空单链表L中第一个值为x的结点,成功返回true,否则返回false。
(用pre、p遍历单链表,pre指向p的前驱,p用来查找值为x的结点,pre用来删除)
bool DeleteXNode(LinkNode* L,ElemType x){//删除单链表中第一个元素值为x的结点。
LinkNode* pre=L;//声明p的前驱指针指向头结点。
LinkNode* p=L->next;//声明p指针指向首结点。
while(p&&p->data!=x){//当p指针不为空和元素没找到同时成立时,进入循环,遍历单链表。
pre=p;
p=p->next;
}
if(!p)return false;//当p指针为空时,说明链表遍历结束也没有找到元素,因此元素不存在,返回false。
else{//找到元素之后删除节点。
pre->next=p->next;
free(p);
return true;
}
}
3.设计一个算法,以链表中第一个结点为基准,将链表中所有值小于第一个元素的结点都放在第一个结点前,大于第一个元素的结点都第一个结点后边。
LinkNode* LinkListProcessing(LinkNode* L){//数据域比首结点小的结点移到首结点左边,大的移到首结点右边。
int i,j=1;//i记录动态分配数组的长度。j记录数组的索引以及在新链表中插入元素的位置。
LinkNode* p=L->next;//定义指针p指向首结点。
LinkNode* newL;//定义一个新的指针作为返回值返回结果。
ElemType* arr=(ElemType*)malloc(sizeof(ElemType)*i);//为数组动态分配内存。
i=0;
while(p){//将链表中的所有元素导入数组。
arr[i++]=p->data;
p=p->next;
}
p=L->next;//p重新指回首结点。
newL=CreateListR(newL,arr,1);//以数组的第一个元素即链表首结点元素创建一个只有一个元素的单链表。
while(p->next){//从数组第二个元素开始遍历,比较,再决定插在前面还是插在后面。
if(arr[0]<arr[j])
ListInsert(newL,++j,arr[j]);
else{
ListInsert(newL,1,arr[j]);
j++;
}
p=p->next;
}
return newL;
}
以上就是本次练习的全部内容。细心的你一定会发现,我这次代码的注释比以前简洁多了,一些特别细节的东西我在慢慢删减。因为很多东西都是我之前反复强调的,没必要再次强调。我之前强调了那么多次,相信大家就算是坐在马桶上读了那么多也会记住那些特别基础的东西吧。学过的东西烂熟于心并真正能运用自如才能真正变成自己的东西。晚安大家,早点睡哦,别为代码秃了头。