对单链表中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点指针。请填充算法中标出的空白处。

作者&投稿:漫静 (若有异议请与网页底部的电邮联系)
对单链表中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点指针。请填充算法中标出的空白处,~

(1) L->next=NULL
(2) p (或p!=NULL)
(3) q (或q!=NULL)
(4) p->next=r->next
(5) r->next=p // (4) 和 (5)是将p结点插入到 r 结点和q 结点之间

楼主你好,这几个问题我来回答你吧,这些都是数据结构里面的基本问题,难度并不太大,可能你没有理解清楚,授人鱼不如授之以渔,除了解答,我还说说解决这些问题的思路,希望你有所启发和感悟。

第1题

碰到这些问题,什么是先序呢?就是先访问根结点,在访问左子树,再访问右子树。中序就是先访问左子树,再访问根节点,再访问右子树。后序不用我说聪明的楼主应该知道了吧。那么根据这个规律,我们可以得出,先序遍历定根结点,中序分左右子树的规律。这个结论有些抽象,下面我们根据这个题目详细说。

先序的第一个是A,那么我们去看中序遍历A的位置,在第4个,这个时候我们就可以得出根节点一定是A,并且A的左子树有BFD,右子树有GEHC,那么到底是什么顺序呢?不急我们一个个看,先看左子树。这个时候我们再回过头去看先序遍历,A的下一个是B,我们在中序遍历中找B,是第一个,那么我们可以肯定的是B一定没有左子树了,B的右子树一定是DF,在根据先序中的顺序可以肯定整棵树的左边如下:
A
/ \
B
\
D
/
F
根据同样的方法可以确定右子树,这个就留给你自己做练习啦。呵呵第一题搞定。

第2题

这个问题的本质其实就是考察2分法是否掌握了。
很明显while( )循环中的条件肯定是low=t.r[i],这从i--可以看出来是每次从链表位开始依次后移一个位置以便插入x。最后for循环体中有一个空,这个就是把x插入进去,很显然是t.r[i]=x;那么这道题也结束啦。

第3题

有了第2题的基础,我不准备给你写完整的算法,我只说说思路咯。思路是,要完成逆转,你可以新建一个链表,然后对于原来的链表尾开始,依次插进新的链表中,当然啦,是头插法了,而第2题中你已经学会了倒过来查找链表,那么这道题是不是也迎刃而解了呢?

最后希望你进步哦~

这个算法有两个循环,我们姑且称其为外循环和内循环,诚如其他楼的一位网友所言,其内循环在第一次判断时进不去是正常的,但后面会进去。为什么呢?首先我们来理一下这个算法的大体思路:这是一个针对单链表的排序算法,就是说给定一个单链表,我们要把按照结点(这里不对头结点进行排序,即这里讨论的结点不包括头结点)的数据域中的data值的大小从小到大进行排序,得到新的排序后的有序链表。我们先把链表的头结点之后的部分链表拆下来,即p=L->next,L->next=NULL,这样我们就拆分原来的链表变成了现在的两个链表(我们称只有一个头结点的链表为L1,另一个全为数据项结点的链表为L2)。接下来我们一个一个从L2剥下单独的结点,放到L1中,其中如果L1中已经有数据项结点,则要先进行data项比较再找到合适的地方插入。直到最后L2中的结点全部拆下来并装到了L1上,于是排序完毕,此时的L1拥有与原来的单链表相同的头结点,但是排列有序的数据项结点。
理完了整个算法的思路后再回去看代码就很明显,外循环判断“p!=NULL”的意义在于判断L2链表中是否还有没有剥完的结点,而内循环中要先判断“q!=NULL”的第一层意义在于判断L1链表是不是一个只有头结点的空表(即无数据项结点),如果是,则直接插入,如果不是,则判断目前L1头结点的下一个结点q的data值是否小于等于刚从L2剥下来的结点p的data值,如果是,则说明这个p结点应该安放的位置还在q结点之后,我们还要继续往下找,直到找到q->data > p->data的结点q或者已经到了链表的末尾(这也是q!=NULL的第二层意义),则停止寻找,并将p结点就放在这个位置。
说了半天忘了回答楼主的疑问,为什么内循环永远不会进去吗?不是,只是第一次不会进去(当然,如果原单链表本身就是一个只有头结点的链表时那么后面也不会再进去了,因为空表根本不需要排序),而后面就会进去,具体原因见我上述分析即可知。

既然是插入函数,除了有链表头应该还要有要插入的元素啊。
上面那个是书上的题目吗,搞不懂,用代码测试一下就可以了
typedef struct node
{
int data;
struct node *next;
}linknode,*link;
void Insertsort(link L,link node)
{
link befor,after;
//如果L是空链表,之间将node加在L后
if(L->next == NUll)
{
L->next = node;
node->next = NULL;
return;
}
//链表不为空
after=L->next;
while((2)after!=null)
{
//node插入中间的情况
if(node->data >= after->data)
{
befor = after;
after = befor->next;
}
else{
befor->next = node;
node->next = after;
return;
}

}
//node最大插入末尾情况
befor->next = node;
node->next = Null;
return;
}

你根据程序走一遍,第一次因为条件不满足,所以满足第一次的循环,跳过第二个循环,继续执行后面的步骤,后面的步骤不全部都在第二个while里面,画个图走一遍,第二次返回的时候就可以用了。

你的问题解决了吗,,,我也不明白

刚刚做到,看q=l→next前是不是有个r=l,后面是不是有个答案(5)r→next=p,就可以更改l啦


设单链表中的数据元素按递增排列,设计一个算法,删除表中所有大于min且...
void delelem(Node *head, int min,int max){ Node *p,*q,*tmp; p=head; q=head->Next; while(q!=NULL&&q->elem<=min) { p=q;q=q->Next;} while(q!=NULL&&q->elem<max) { tmp=q; p->Next=q->Next; q=q->Next; free(tmp); ...

编写一个函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然有...
} 解释:如果原链表为空,直接插入新结点为head;如果原链表只有头结点,插入新节点在head.next位置。大于两个结点时,遍历有序的链表直到找到一个比新节点大的结点,把新节点插在他前面。那个inserted的作用是,如果遍历完整个链表,没有比新节点大的,这时候inserted还是false,所以把新节点插在最后。

已知具有N个数据元素的线性单链表L,利用单链表后插入算法,在L中第i个...
int j=1; p=head; while(jnext) { p=p->next; j++; } if(j==i) { q=new node(e); q->next=p->next; p->next=q; } else { printf("链表没有%d个元素",i); }

在单链表中,最后一个结点的指针是什么意思?
线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素。仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点。对最后一个元素和第一个元素操作对带尾指针的单循环链表是非常方便的。

单链表 在递增有序单链表中插入元素并保持递增有序
1用递归算法对int型数组进行双向选择排序#include<stdio.h> void paixu(int x[],int m,int n){ int max,min,e,q,l=m,k=m;if(m>=n) return;max=x[m];for(e=m;e<=n;e++){ if(x[e]>max) {l=e;max=x[e];} } q=x[n];x[n]=x[l];x[l]=q;min=x[m];for(e=m...

建立单链表,在单链表的第i个元素前插入x
printf("依次输入链表元素,#结束:\\n");createlist(L);printf("创建的链表为:\\n");printlinklist(L);printf("输入要在第几个元素前插入:\\n");scanf("%d",&i);getchar();printf("输入要插入的节点值:\\n");scanf("%c",&x);getchar();printf("在第%d个节点前插入节点%c:\\n",...

在一个单链表中,如果要删除最后的一个元素,需要遍历整个链表吗?
选D。某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用仅有尾指针的单循环链表存储方式最节省运。仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点,头结点的下一个结点就是第线性表的第一个结点。对最后一个元素和第一个...

单链表的逆置是什么意思
可理解成,将原来单链表的结点取下来,采用单链表的头插法,插入头结点之后。当完成后,最后一个结点变成首元结点,原来的首元结点变成最后一个结点,其他的依次类推。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。

在数据结构中创建一个单链表,要求单链表的元素按升序排列,输出单链表...
\/\/链表指针实现 include<stdio.h> include<malloc.h> \/\/需要malloc.h struct node { int i;struct node *pre,*next;};struct node head;void init()\/\/初始化 { head.i=0;head.pre=NULL;head.next=NULL;} struct node *ins(struct node *p,int i) \/\/在p位置后插入i { struct node...

在一个单链表中,若p所指的结点不是最后结点,则删除p所指的结点的后继...
【答案】:C 本题考查的是单链表的删除操作。在已知链表中元素插入或删除确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针而无须移动元素。

娄星区19826091164: 对单链表中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点指针.请填充算法中标出的空白处, -
姜霄复方: (1) L->next=NULL(2) p (或p!=NULL)(3) q (或q!=NULL)(4) p->next=r->next(5) r->next=p // (4) 和 (5)是将p结点插入到 r 结点和q 结点之间

娄星区19826091164: 怎么用C语言写单链表的排序
姜霄复方: 从键盘输入不定数量的数字构造链表,输入0结束,然后排序输出,代码如下:#include <stdio.h>#include <stdlib.h>#include <conio.h>typedef struct _list { int val; struct _list* next;} *node, list;/* 插入节点 */node Insert( node* head, node pos, int ...

娄星区19826091164: C语言问题求解 建立链表,用插入法排序, -
姜霄复方: 展开全部#include /*单链表方式的实现*/#include typedef char ElemType; typedef struct LNode /*定义链表结点类型*/ { ElemType data; struct LNode * next; }LNode, * LinkList;/*在带头结点的单链表中第i个位置(从1开始)插入元素,仍保持递增性*...

娄星区19826091164: 求一个C语言单链表的排序函数,很急很急 -
姜霄复方: 用选择排序就行,代码如下.链表结构如下:typedef struct Node { T value; struct Node *link; }Node; void selectSort(Node *node) { Node *cur; /*当前节点*/ Node *next; /*遍历未排序节点*/ Node *min; /*指向未排序节点中最小节点*/ T temp;...

娄星区19826091164: C语言 单向链表如何排序? -
姜霄复方: void link_order(STU *p_head) { STU *pb, *pf, temp; pf = p_head; if(p_head == NULL) {//链表为空 printf("needn't order.\n"); return ; } if(p_head->next == NULL) {//链表有1个节点 printf("only one print, needn't order.\n"); return ; } while(pf->next !...

娄星区19826091164: 用C语言实现数据结构中常用算法,如对链表的操作、查找、排序等. -
姜霄复方: #include <iostream.h> class ram { public: char wenzi[200]; ram *p; }; ram wo,*ai=&wo; int num=0;//我申请了几次内存了 void xie(void);//输入数据,然后分配内存为下次做准备. void du(void);//把写入的数据全部显示出来 int main(void) { while(1)...

娄星区19826091164: C语言 自定义函数 链表排序 -
姜霄复方: 用插入排序做了一下#include typedef struct data { int value; struct data *next; }data; int sort_link(data **op_list) { data *p1 = NULL; // 当前待排序的节点 data *p2 = NULL; // 待排序链表表头 data *q = NULL; // 有序链表表头 data *t1 = NULL; // 插...

娄星区19826091164: 编写一个算法,用单链表表示的待排序关键码序列上实现简单选择排序.(用c写) -
姜霄复方: #include"stdio.h" #include<malloc.h>typedef char ElemType;typedef struct LNode {ElemType data; struct LNode *next; }LinkList;void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表 {LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(...

娄星区19826091164: 新手求助:C语言中什么是插入排序法?我这里有道例题,但我看不明白 -
姜霄复方: vStatus SortList_Sq(SqList &L) { //用插入排序算法对顺序表L中的元素进行排序 for (i = 2; i <= L.length; ++i)//L.elem[0]是用来交换值的中间变量 if (L.elem[i] < L.elem[i-1]) {//因为是从小到大排列所以只有当现在要排列元素小于前一个时才需要调整以...

娄星区19826091164: 单链表排序问题(C语言) -
姜霄复方: 经典算法--单链表选择排序第一种:#include<stdio.h>#include<stdlib.h> typedef struct node{ int data; struct node *next; }*Linklist,Node; Linklist creat(int n) {Linklist head,r,p; int x,i; head=(Node*)malloc(sizeof(Node)); r=head; printf("输入数字:\...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网