单链表的插入排序

haibianyoushark 2017-11-02 10:13:12
这是单链表的插入排序,不懂为什么p->next一定要为空?
void sortlist()
{
node * newhead, * s, * pre ,* p;
p=head->next;
newhead=p->next;
p->next=NULL;//这里p为什么一定要为空?
while(newhead)
{
s=newhead;
newhead=newhead->next;
pre=head;
p=head->next;
while(p!=NULL && p->a < s->a)
{
pre=p;
p=p->next;
}
s->next=p;
pre->next=s;
}
}
...全文
365 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
destory27 2017-11-05
  • 打赏
  • 举报
回复
#include <stdio.h> #include <windows.h> #include <malloc.h> #include <string.h> typedef struct LoopList{ int num; struct LoopList *next; }list; void cursor(void) { system("color 0A"); system("title Circular points list"); system("mode con lines=20 cols=40"); //HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //DWORD dword = 18; //BOOL SetConsoleFont(handle, dword); return ; } void chooseMenu(void) { printf("----------------------------------------"); printf("\tLoop singly linked list \t"); printf("----------------------------------------"); printf("\t************************\t"); printf("\t*1.初始化\t2.添加*\t\t"); printf("\t*3.元素个数\t4.插入*\t\t"); printf("\t*5.显示\t\t6.排序*\t\t"); printf("\t*7.查找\t\t8.取出*\t\t"); printf("\t*\t 0.退出 \t\t"); printf("\t************************\t"); printf("----------------------------------------"); return ; } list * init(list **head) { *head = (list *)malloc(sizeof(list)); (list *)memset(*head, 0x00, sizeof(list)); (*head)->next = *head; printf("初始化成功。\012"); Sleep(3000); return *head; } list *add(list **head) { list *s = *head; int n; printf("你要添加的元素个数:"); while((scanf("%d", &n)) == 0){ fflush(stdin); printf("Enter again:"); } while(n--){ list *p = (list *)malloc(sizeof(list)); (list *)memset(p, 0x00, sizeof(list)); printf("input data:"); while((scanf("%d", &p->num)) == 0){ fflush(stdin); printf("Enter again:"); } while(s->next != *head){ s = s->next; } s->next = p; p->next = *head; } printf("添加完成。\012"); Sleep(3000); return *head; } void size(list **head) { int size = 0; list *p = *head; while(p->next != *head){ p = p->next; ++size; } printf("元素个数:%d\012", size); Sleep(3000); return ; } void insert(list **head) { list *s = *head; list *p = (list *)malloc(sizeof(list)); (list *)memset(p, 0x00, sizeof(list)); printf("insert num:"); while((scanf("%d", &p->num)) == 0){ fflush(stdin); printf("Enter again:"); } while(s->next != *head) s = s->next; s->next = p; p->next = *head; printf("插入完成.\012"); Sleep(3000); return ; } void sort(list **head) { list *p = *head; if(p->next == *head || p->next->next == *head){ printf("数据为空或只有一个无法进行排序.\012"); Sleep(3000); } else{ int i = 0; int arr[100]; while(p->next != *head){ arr[i++] = p->next->num; p = p->next; } int t = i; for(i = 0; i < t-1; ++i){ int j = i; int temp = arr[j+1]; while(j > -1 && temp < arr[j]){ arr[j+1] = arr[j]; --j; } arr[j+1] = temp; } p = *head; i = 0; while(p->next != *head && i < t){ p->next->num = arr[i++]; p = p->next; } printf("排序完成.\012"); Sleep(3000); } return ; } void show(list **head) { list *p = *head; if(p->next == *head){ printf("要显示的内容为空.\012"); Sleep(3000); } else{ while(p->next != *head){ printf("%d ", p->next->num); p = p->next; } printf("\012"); printf("已显示完."); printf("\012"); Sleep(3000); } return; } void seek(list **head) { list *p = *head; if(p->next == *head){ printf("数据内容为空.\012"); Sleep(3000); } else{ int n; printf("输入你要查找的数:"); while((scanf("%d", &n)) == 0){ fflush(stdin); printf("Enter again:"); } int i = 1; int count = 0; while(p->next != *head){ if(p->next->num == n){ printf("第%d个数是%d.\012", i, n); ++i; ++count; p = p->next; } else { ++i; p = p->next; } } if(count == 0) printf("没有此数据.\n"); Sleep(3000); } return ; } void delete(list **head) { list *p = (*head)->next; if(p == *head){ printf("数据内容为空.\012"); Sleep(3000); } else{ list *s = *head; list *temp = NULL; int n; printf("输入你要查找的数:"); while((scanf("%d", &n)) == 0){ fflush(stdin); printf("Enter again:"); } while(p != *head){ if(p->num != n){ s = p; p = p->next; } else{ temp = p; s->next = p->next; p = p->next; } } if(temp == NULL) printf("未找到要删除的数据.\012"); else printf("已取出 %d \012", temp->num); Sleep(3000); } return; } int main(void) { cursor(); chooseMenu(); list *head; int flag = 1; while(1){ int choose; system("cls"); chooseMenu(); printf("please choose:"); while((scanf("%d", &choose)) == 0){ fflush(stdin); system("cls"); chooseMenu(); printf("Enter again:"); } while(flag){ if(choose == 1) flag = 0; else if(choose == 0) exit(0); else { printf("必须先初始化.\012"); printf("please choose:"); while((scanf("%d", &choose)) == 0){ fflush(stdin); system("cls"); chooseMenu(); printf("Enter again:"); } } } switch(choose){ case 1: head = init(&head);break; case 2: head = add(&head);break; case 3: size(&head);break; case 4: insert(&head);break; case 5: show(&head);break; case 6: sort(&head);break; case 7: seek(&head);break; case 8: delete(&head);break; case 0: exit(0); default: printf("error!\012");Sleep(2000);break; } } return 0; }
CT8100 2017-11-03
  • 打赏
  • 举报
回复
你看下面有一句判断 while(p!=NULL && p->a < s->a);如果不赋NULL初值的化这句判断就无效过了!
li374456042 2017-11-03
  • 打赏
  • 举报
回复
代码有问题,输入空的或者单节点的链表,会崩溃。所以换一个答案参考。
Davidsdu 2017-11-03
  • 打赏
  • 举报
回复
结束下面的while()循环,p->next=NULL后相当于先建了另一条新链表,该链表只包含头结点和原链表的第一个数据结点。 然后newHead指向原链表的第二个数据结点,然后开始依次通过比较方法插入新链表中,当新链表中的结点数据均小于newHead指向的旧链表数据结点时,此时需要结束while循环,此时p==NULL退出while循环,然后将newHead指向的数据结点插入新链表的末尾。
das白 2017-11-02
  • 打赏
  • 举报
回复
初始化 方便下面循环判断
数据结构单链表插入、删除和修改实验报告 一、实验目的 1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表的插入、删除和查询算法的设计与JAVA实现。 4.熟练掌握简单的演示菜单与人机交互设计方法。 二、实验内容 1. 编制一个演示单链表插入、删除、查找等操作的程序。 三、实验步骤 1.需求分析 本演示程序用JAVA编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。   ③ 程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。 ④ 测试数据:  A. 插入操作中依次输入11,12,13,14,15,16,生成一个单链表    B. 查找操作中依次输入12,15,22返回这3个元素在单链表中的位置    C. 删除操作中依次输入2,5,删除位于2和5的元素 2.概要设计 1)为了实现上述程序功能,需要定义单链表的抽象数据类型:   ADT LinkList {    数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}    数据关系:R={|ai,ai+1 ∈D}    基本操作: (1)insert 初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。   (2)decelt     操作结果:删除已有的单链表的某些结点。 (3)display     操作结果:将上述输入的元素进行排列显示。    (4)modify     操作结果:将上述输入的某些元素进行修改。    (5)save     操作结果:对上述所有元素进行保存。    (6)load     操作结果:对上述元素进行重新装载。   }   2)本程序包含7个函数:   ① 主函数main()   ② 保存单链表函数save()   ③ 重载操作菜单函数load()   ④ 显示单链表内容函数display ()   ⑤ 插入元素函数insert ()   ⑥ 删除元素函数decelt ()   ⑦ 修改元素函数modify()   各函数间关系如下: 3.详细设计   实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。   1) 结点类型和指针类型   typedef struct node {    int data;    struct node *next;   }Node,*singleLIST.java;   2) 单链表的基本操作   为了方便,在单链表中设头结点,其data域没有意义。 bool insert(singleLIST) (伪码算法)   bool modify(singleLIST) (伪码算法)   void delect(singleLIST)   (伪码算法)   void display()   (伪码算法) 3) 其他模块伪码算法 4.调试分析   (略) 5.使用说明 程序名为 ,运行环境为Windows。程序执行后显示   ========================   0----EXIT   1----INSERT   2----DELETE   3----DISPLAY 4----MODIFY 5----EXIST =======================   SELECT:   在select后输入数字选择执行不同的功能。要求首先输入足够多的插入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择5:退出程序   选择1:显示"INSERT =" ,   要求输入要插入的位置和元素的值(都是整数)。   选择2:显示"DELETE =" ,   要求输入要删除元素的位置,执行成功后返回元素的值。   选择3:显示"MODIFY = " , 选择要修改的对象,执行成功后返回新的元素值。 选择4:显示"DIAPLAY= "   显示所有单链表中的元素,自动进行排序。

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧