灵魂
这么多工作,却不给点分,楼主你过意的去吗?5道中4道链表结构题,没有哪年的考研会按这种比例出题的...回到正题,首先是通用的代码=====链表的声明=====typedef struct linknode{ int data; //你没有说所需data的类型,所以我都按int写了,能满足你这题的要求 struct linknode *next;}Node; 第1题核心思想:从第一个元素开始遍历,记录下位于当前序列最考前的正数的位置(j+1),将在它后面遍历到的第一个负数与(j+1)交换,j重新指向当前序列最考前的正数的位置,循环尽执行n,复杂度O(n)arrange(int a[], int n){ //我就设数组长度为n了 int i,j,temp; j=-1; for(i=0; i<n; i++) if(a[i]>0) j++; else { temp=a[i]; a[i]=a[j+1]; a[j+1]=temp; j++; }} //执行完毕时,前a[0]~a[j]全是是负数,后面的都是正数 第2题核心思想:从头遍历这个链表,始终记录下所遍历过的节点中,data最小的节点的前一个节点的link值,遍历完毕后,将最小节点挪到第一个节点之前,并把断开的地方连上//按你题的意思,我就当list是这个链表的头节点了,data就是int类型,link就是最开始声明中的nextfindMin(Node* list) Node* i,temp; int min=list->data; //初始化最小值为第一个元素的data i=list; while(i->next->next != NULL){ if(i->next->data < min){ min=i->next->data; temp=i; //更新拥有最小值的节点前面那个节点的位置 } i=i->next; } //下面是把temp后面那个节点挪到list之前 if(temp->next->next != NULL) temp->next = temp->next->next //如果temp不是倒数第二个节点 //则先把后面的节点接上去 temp->next = list; //temp就是整理之后链表的首地址,有需求的话就添加一个return temp;} .......写累了,后面3个有点组合应用的意思,给你简单讲下思想吧,留给你自己练习写代码吧第3题核心思想:就是第1题和第2题的结合,第1题中把序列容器由数组换成链表即可,然后将第j+1个节点作为分界点,前面那个子链表就是B链表,后面那个就是C链表 第4题不知道这题啥意思,如果仅仅是考链表的声明、创建、赋值,前面的代码中已经写了,如果是要用类似C语言之类的需要自己申请内存地址的语言,就用:newLinkNode = (Node*) malloc (sizeof(Node)); 第5题核心思想:这题需要写几个子函数,可以分为: push(): 弹出第一个节点并更新首节点地址 save(): 创建一个新节点添加到当前节点尾部 arrange():将尾部的元素与它前面节点的data依次进行比较,找到第一个比它小的节点,然后与其后的节点进行交换 main(): 依次创建节点,填入序列中读出的值直至读到0,调用save()将新节点联接到链表中,调用arrange()对链表进行排序,这里就用的插入排序了,实现简单。 另外,在主函数中应该记录下当前链表中首节点与尾节点的地址,作为全局变量,方便子函数调用。