【c++期末刷题】完成函数 listSort 的编写,该函数对单向链表进行 从小到大排序并返回。

/*------------------------------------------------ 
【程序设计】
-------------------------------------------------- 
题目:完成函数 listSort 的编写,该函数对单向链表进行
 从小到大排序并返回。
-------------------------------------------------- 
注意:仅在标有"Program"和"End"的注释行之间补充填写
 代码。请勿改动主函数 main 和其它任何已有内容。
------------------------------------------------*/ 
#include<iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
void grading(); 
struct Node { 
 int num; 
 Node *next; 
}; 
Node * listSort(Node *head) 
{ 
/*********Program*********/
	Node* p = head;
	for(;p!=NULL;p=p->next){
		for(Node* j=p->next;j!=NULL;j=j->next){
			if(p->num>j->num){
				swap(p->num,j->num);
				
			}
			
			
		}
		
		
	}
return head;

 
/********* End *********/ 
}

 
void deleteList(Node *head) 
{ 
 Node *tmp; 
 while (head) 
 { 
 tmp = head->next; 
 delete head; 
 head = tmp; 
 } 
} 
void printList(Node *head) 
{ 
 while(head) 
 { 
 cout<<head->num<<" "; 
 head = head->next; 
 } 
 cout<<endl; 
} 
Node * createList(int a[], int len) 
{ 
 Node *head = NULL; 
 if(len<1) 
 return head; 
 for(int i=0;i<len;i++) 
 { 
 Node *tmp = new Node; 
 tmp->num = a[i]; 
 tmp->next = head; 
 head = tmp; 
 } 
 return head; 
} 
int main() 
{ 
 int s[8] = {2,6,4,2,7,9,5,12}; 
 Node * head = createList(s,8); 
 head = listSort(head); 
 printList(head); 
 //忽略阅读
 //忽略阅读结束
 deleteList(head); 
 return 0; 
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 函数insertlist的作用是将一个指向node结点的指针tmp插入一个按照num成员从小到大排序单向链表中,并返回链表。 具体实现可以按照以下步骤: 1. 如果链表为空,直接将tmp作为新链表的头结点,并返回链表。 2. 如果链表不为空,需要找到tmp应该插入的位置。可以从头结点开始遍历链表,找到第一个num大于等于tmp->num的结点,将tmp插入到该结点之前。 3. 如果遍历到链表末尾都没有找到合适的位置,说明tmp应该插入到链表末尾。 4. 插入完成后,返回链表的头结点。 具体实现可以参考以下代码: ``` struct node* insertlist(struct node* head, struct node* tmp) { if (head == NULL) { // 链表为空,直接将tmp作为新链表的头结点 head = tmp; tmp->next = NULL; return head; } if (tmp->num < head->num) { // tmp应该插入到链表头部 tmp->next = head; head = tmp; return head; } struct node* p = head; while (p->next != NULL && p->next->num < tmp->num) { // 找到第一个num大于等于tmp->num的结点 p = p->next; } tmp->next = p->next; // 将tmp插入到该结点之前 p->next = tmp; return head; } ``` ### 回答2: 函数insertlist的作用是将一个按照成员num从小到大排序单向链表中插入一个指针tmp指向的node结点,并返回链表。为了完成这个函数编写,我们需要考虑以下几个方面: 1.插入的node结点应该放在什么位置? 考虑到链表是按照num从小到大排序的,插入新结点的时候需要找到恰当的位置。可以从头结点开始遍历链表,直到找到一个大于等于插入结点num值的位置,将插入结点插入到该位置之前。 2.如何处理特殊情况(如链表为空,或插入的结点num值最小或最大)? 如果链表为空,则可以将新结点作为头结点。如果插入的结点num值比链表中所有结点的num值都小,则可以将新结点作为头结点,并让原来的头结点成为新结点的next指针。如果插入的结点num值比链表中所有结点的num值都大,则可以将新结点作为链表的尾结点。 3.如何更改链表的指针? 插入结点的过程包括三个步骤:找到待插入位置,更改插入结点next指针,更改插入位置前一个结点的next指针。具体过程可以写成如下代码: Node *insertlist(Node *head, Node *tmp){ Node *p, *q; p = head; if(head == NULL){ //如果链表为空,则插入结点作为头结点 head = tmp; tmp->next = NULL; return head; } if(tmp->num < head->num){ //如果插入结点num值比所有结点的num值都小 tmp->next = head; head = tmp; return head; } while(p!=NULL && p->num<tmp->num){ //找到待插入位置 q = p; p = p->next; } if(p == NULL){ //如果插入结点num值比所有结点的num值都大 q->next = tmp; tmp->next = NULL; } else{ q->next = tmp; tmp->next = p; } return head; } 以上是关于函数insertlist的设计和编写过程,函数的完整代码需在包含node结构体和main函数的程序中实现。 ### 回答3: 这道题要求我们完成一个函数insertlist编写,该函数将一个按num从小到大排序单向链表中插入一个node结点,并返回链表。我们可以按照以下步骤来实现。 首先,我们要确定新链表的头结点。新插入的node结点可能会影响原有链表的头结点,所以我们需要进行判断。如果原链表为空或者插入的节点num比原链表头结点num小,则将node结点作为新的头结点,并返回新的头结点;否则,头结点不变。 接着,我们需要找到插入节点的位置。由于单向链表只能从头到尾遍历,我们需要从头开始遍历链表,直到找到第一个num大于插入节点num的结点。然后,将插入节点插入到该节点之前。 最后,我们需要注意代码的实现。插入节点之后,我们需要将插入节点的next指针指向下一个节点。而如果插入的节点是新的头结点,则需要将原头结点作为插入节点的next指针。 下面是代码实现的参考: ```c++ // 定义链表节点结构体 struct node { int num; node *next; }; // 插入节点函数 node *insertlist(node *head, node *tmp) { // 如果链表为空或者插入节点num比头结点num小,则将插入节点作为新的头结点 if (head == NULL || tmp->num < head->num) { tmp->next = head; return tmp; } // 找到插入节点的位置 node *cur = head; while (cur->next != NULL && cur->next->num < tmp->num) { cur = cur->next; } // 在该位置插入节点 tmp->next = cur->next; cur->next = tmp; return head; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值