精华内容
下载资源
问答
  • C语言链表节点排序

    千次阅读 2019-05-07 19:54:45
    初次用到链表排序还是在C语言课程设计上,当时想着要把代码发到CSDN上,结果一拖再拖到现在。 我的课程设计项目为“学生成绩管理系统”,所用链表为双向链表链表。 涉及到成绩管理则避免不了成绩的排序。 结构体中...

    初次用到链表的排序还是在C语言课程设计上,当时想着要把代码发到CSDN上,结果一拖再拖到现在。

    我的课程设计项目为“学生成绩管理系统”,所用链表为双向链表链表。
    涉及到成绩管理则避免不了成绩的排序。
    结构体中的项目包括:

    1. 学生成绩;
    2. 学生姓名;
    3. 学生学号;
    4. 结构体的头指针与尾指针;
      先创建结构体:
    #include"stdio.h"
    #include"stdlib.h"
    #include"string.h"
    struct student
    {
    	struct student *ahead;
    	float grade[10];
    	char name[10];
    	char x[10];
    	struct student *next;
    }*head, *end, *New, *get, *stu;
    

    设置head指针和end指针。head指向头结点,end始终指向尾节点。
    输入数据:

    int input(int N, char **G)//数据输入
    //变量说明:“N”为考试的科目数量,此处**G为字符串指针数组,其中存储着考试科目。
    {
    	int i, c = 1, icount = 0, s[10], j, k, d;
    	char r[10];
    	for (j = 0; j < 10; j++)
    		s[j] = 0;
    	while (c)
    	{
    		New = (struct student *)malloc(sizeof(struct student));
    		printf("\t\t输入该名学生姓名(结束请按‘0’):");
    		scanf("%s", New->name);
    		if (New->name[0] != 48)
    		{
    			printf("\t\t输入该名学生学号:");
    			scanf("%s", r);
    			icount++;
    			strcpy(New->x, r);
    			New->grade[N] = 0;
    			for (i = 0; i < N; i++)
    			{
    				printf("\t\t%s成绩:", G[i]);
    				scanf("%f", &New->grade[i]);
    				if (New->grade[i] < 60)
    					s[i]++;
    				New->grade[N] = New->grade[N] + New->grade[i];
    			}
    			strcpy(New->mima, "1234");
    			end->next = New;
    			New->ahead = end;
    			end = New;
    			end->next = NULL;
    		}
    	}
    	else
    	{
    		c = 0;
    	}
    }
    

    链表已经创建完成,现在只需要向其中添加数据,下一步祭出我屌炸天 的链表节点排序代码?
    此代码运用简单选择排序的排序方法。即,先比较两个节点中数据的大小,并两个选中较大或较小的一个。并让选中的节点与下一个节点中的数据比较直到最后一个节点。比较完毕后将最小的节点接到链表的最后。
    当然,开始排序之前,我创建了一个空节点让其存储成绩的数组的每一个元素都等于“-1”将其接到了链表的最后作为新的有序链表与旧的无序链表的边界。在排序完毕后程序自动将此空节点删除。得到的就是新的有序数组。

    1.排序前的准备阶段(假设此处为升序排序)

    主要步骤为:

    1. 创建三个结构体指针“ *min”、“*xunow”、“ *uend”;
    2. uend就是我添加的边界空指针;
    int paixu(int N)//成绩排序
    {
    	int i;//在程序的后便会让用户选择升序还是降序排序,变量i的作用是根据i的值选择排序方式。若i为1则降序排列,0则升序排列
    	struct student *min, *xunow, *uend;
    	uend = (struct student *)malloc(sizeof(struct student));
    	uend->grade[0] = -1;
    	uend->next = NULL;
    	uend->ahead = end;
    	end->next = uend;
    

    2.排序执行阶段

    上一步中创建的三个结构体指针已经用掉了一个,在这一步中“min”代表比较值最小的节点。"xunow"表示当前与min节点比较的节点。

    1. 通过简单选择排序找出旧链表中的最小值节点;
    2. 将此最小值节点接到链表的最后;
    printf("\n\t\t升序排序(0)     降序排序(1)\n\t\t");
    	scanf("%d", &i);
    	for (min = head->next; min->next->grade[0] != -1; min = head->next)
    	{
    		xunow = min->next;
    		if (i == 0)
    		{
    			do
    			{
    				if (xunow->grade[0] < min->grade[0])
    				{
    					min = xunow;
    				}
    				xunow = xunow->next;
    			} while (xunow->next->grade[0] != -1 && xunow->grade[0] != -1 && min->next->grade[0] != -1);
    			min->ahead->next = min->next;
    			min->next->ahead = min->ahead;
    			min->ahead = uend;
    			uend->next = min;
    			uend = min;
    		}
    		else
    		{
    			do
    			{
    				if (xunow->grade[0] > min->grade[0])
    				{
    					min = xunow;
    				}
    				xunow = xunow->next;
    			} while ( xunow->grade[0] != -1 && min->next->grade[0] != -1);
    			min->ahead->next = min->next;
    			min->next->ahead = min->ahead;
    			min->ahead = uend;
    			uend->next = min;
    			uend = min;
    		}
    		
    	}
    

    3.排序完成收尾阶段

    在执行完上步代码后,表明排序基本完成。按照步骤,此时边界空节点的旧链表一侧还有最后一个具有有效数据的节点,即存储最大数据的节点。现在只需要将此节点与边界节点一起转移到整个链表的最后再删除边界节点,就能最终完成链表的排序。

        min = head->next;
    	xunow = min->next;
    	head->next = xunow->next;
    	xunow->next->ahead = head;
    	xunow->next = NULL;
    	min->ahead = uend;
    	uend->next = min;
    	uend = xunow;
    	end = uend->ahead;
    	uend->ahead->next = NULL;
    	free(uend);
    	return 0;
    }
    

    这就是自己在本学期的课程设计中,灵光一现敲出的链表节点排序代码。虽然不够简洁但不管怎么样这段代码还是实现了功能,即节点排序。

    展开全文
  • 给一个简单的数组冒泡排序算法和程序c语言链表冒泡排序,注释应写具体。不要在别处粘贴代码过来。我想实习的是交换的是它们的指针域也就是每个节点而不是结点后面的数据。C/C++ codestruct Node{int data;struct ...

    ef51c0f380615533401969f5c2f3a35f.png

    给一个简单的数组冒泡排序算法和程序c语言链表冒泡排序,注释应写具体。不要在别处粘贴代码过来。我想实习的是交换的是它们的指针域也就是每个节点而不是结点后面的数据。

    C/C++ code

    8de716c77aa003f164b6fb1791bd377a.png

    struct Node

    {

    int data;

    struct Node * pNext;

    };

    假设里面已经定义好了节点,也生成了一个链表出来了(带有头结点的),现在他们即使帮我排序的代码跟算法要写具体。

    ------解决方案--------------------

    c5b9642cf2bf0cd195ff1fd956c029d4.png

    你还不如在网上搜一下源码快!

    ------解决方案--------------------

    在那些帖子里早已回答了

    50af78e18659b79d5a213449406e90b3.png

    那代码也需要是可以的,你只必须顺序就把排序的部分取起来

    可以直接用的

    ------解决方案--------------------

    5b26e0369ca13289125a46347a609577.png

    C/C++ code

    /**功能:求链表长度(头结点不计算)*参数:链表首地址*返回值:链表结点数*/int length(linklist head){int len = 0;if(head == NULL)return 0;head = head->next;while(head != NULL){++len;head = head->next;}return len;}/**功能:判断两个结点的数据大小*参数:两个结点的地址*返回值:firstNode中数据大于secondNode中数据返回1*firstNode中数据等于secondNode中数据返回0*firstNode中数据小于secondNode中数据返回-1*/int nodeCompare(linklist firstNode, linklist secondNode){if(firstNode->data > secondNode->data)return 1;else if(firstNode->data == secondNode->data)return 0;else if(firstNode->data < secondNode->data)return -1;return -2;}/**功能:链表排序(带头结点)*参数:链表首地址**/void listSort(linklist head){linklist pre, mid, tai;int i, j;int len = length(head);if(head == NULL || head->next == NULL)return;for(i = 0; i < len - 1; ++i){pre = head;mid = head->next;tai = mid->next;for(j = 0; j < len - i - 1; ++j){if(nodeCompare(mid, tai) == 1){pre->next = mid->next;mid->next = tai->next;tai->next = mid;}pre = pre->next;mid = pre->next;tai = mid->next;}}}

    ------解决方案--------------------

    C/C++ code

    void listSort(linklist head){linklist pre, mid, tai;int i, j;int len = length(head);if(head == NULL || head->next == NULL)return;for(i = 0; i < len - 1; ++i){//每次排序都是从头结点开始,共len次pre = head; //记录前一个节点mid = head->next;//记录中间节点tai = mid->next;//记录尾节点for(j = 0; j < len - i - 1; ++j){if(nodeCompare(mid, tai) == 1){//如果成立pre->next = mid->next;//将pre后面的两个节点交换位置mid->next = tai->next;//即pre的next的指向他的下下个节点,tai->next = mid;//他的下节点成为他的下下节点c语言链表冒泡排序,其他不变}pre = pre->next;//循环遍历后面的结点mid = pre->next;tai = mid->next;}}}

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-137386-1.html

    展开全文
  • c语言单链表节点排序

    千次阅读 2019-10-11 23:14:23
    c语言中的链表节点排序,然后查过网上一些源码,有很多就没有实现这个功能,有的只是单个数据修改而已,所以刚巧从书中找到一个案例,就分享一波 源码: void sort(Stu head){ Stu p,q,r,t; int flag = 1; while...
    需求:

    c语言中的链表节点排序,然后查过网上一些源码,有很多就没有实现这个功能,有的只是单个数据修改而已,所以刚巧从书中找到一个案例

    源码:
    void sort(Stu head){
    	Stu p,q,r,t;
    	int flag = 1;
    	while(flag){
    		p = head;
    		q = head->next;
    		flag = 0;
    		while(q != NULL){
    			r = q->next;
    			if(r == NULL){
    				break;
    			}else if(q->svgNum < r->svgNum){
    				t = r->next;
    				q->next = t;
    				r->next = q;
    				p->next = r;
    				p = r;
    				q = p->next;
    				r = q->next;
    				flag = 1;
    			}else{
    				p = q;
    				q = p->next;
    			}
    		}
    	}
    }
    
    备注:

    结构体:
    typedef struct Student{
    char sid[10]; //学号
    char name[10]; //名字
    float mathNum;
    float engNum;
    float svgNum;
    Student * next;
    }*Stu;

    展开全文
  • 如下链表的增删改查,并没完善,代码有待优化,这牵涉算法。我的时间似乎挤得好满,抽不出时间来优化,基础也薄弱,过段时间基础好点了来改,参考的同道谅解下。 #include &amp;amp;amp;amp;amp;amp;amp;amp;...

    链表的增删改查,这儿加了链表节点的排序问题,希望对初学者有帮助。
    代码如下:

    #include "pch.h"
    #include <iostream>
    #include<stdlib.h>
      //链表的增删改查
    typedef int DATA;
    struct LinkList
    {
    	DATA data;
    	LinkList* next;
    };
    LinkList* pHead = NULL;
      //建立链表,添加节点
    void Append(DATA data)
    {
    	LinkList* p1 = pHead;
    	LinkList* news = (LinkList*)malloc(sizeof(LinkList));
    	if (news != NULL)
    	{
    		news->data =data;
    		news->next = pHead;
    		pHead = news;
    	}
    	else
    	{
    		printf("没有申请成功!");
    	}
    }
      //记录链表长度,如果没有特殊要求可以不必记录链表长度
    int listLen()
    {
    	int nlength = 0;
    	LinkList* p = pHead;
    	while (p)
    	{
    		nlength++;
    		p = p->next;
    	}
    	return nlength;
    }
      //在链表中插入节点
    int InsertNode(DATA data, DATA data1)//InsertNode(插入的位置,要插入的数据)
    {	
    	LinkList* p = pHead;
    	while (p)
    	{
    		if (p->data == data)
    		{
    			LinkList* newsNode = (LinkList*)malloc(sizeof(LinkList));
    			newsNode->data = data1;
    			newsNode->next = p->next;
    			p->next = newsNode;
    			return 1;
    		}
    		p = p->next;
    	}
    	return 0;
    }	
    
       //删除节点
    int deleteNode(int data)
    {
    	LinkList* p = pHead;
    	LinkList* p1 = NULL;
    	if (pHead->data== data)
    	{
    		pHead = pHead->next;
    		free(p);
    		return 1;
    	}
    	while (p)
    	{	
    		if (p->data == data)
    		{
    			p1->next = p->next;
    			free(p);
    			return 1;
    		}
    		p1 = p;//保留节点
    		p = p->next;//下一个节点
    	}
    	return 0;
    }
      //修改节点里的值
    int modify(DATA data, DATA ndata)//modify(源数据,要赋值的数据)
    {
    	LinkList* p = pHead;
    	while(p)
    	{
    		if (p->data==data)
    		{
    			p->data = ndata;
    			return 1;
    		}
    		p = p->next;
    	}
    	return 0;
    }
      //查询节点,指定数据查找
    int contentNode(DATA data)
    {
    	LinkList* p = pHead;
    	while (p)
    	{
    		if (p->data==data)
    		{
    			printf("位置在:%p 值为:%d", p, p->data);
    			return 1;
    		}
    		p = p->next;
    	}
    	return 0;
    }
    
      //对链表节点里的值,在这儿就是数字,进行从小到大排序。可能不太好理解,可以用印象笔记圈点画图分析,只要理解p1和p2的指针指向的变化,就能理解这个排序
    void orderBy()
    {
    	LinkList* p = pHead;	
    	while (p)
    	{
    		LinkList* p1 = p->next;
    		LinkList* p2 = p;	
    		while (p1)
    		{	
    			if (p2->data > p1->data)
    			{
    				p2 = p1;
    			}
    			p1 = p1->next;
    		}					
    		if (p2!=p)
    		{
    			DATA temp = p->data;
    			p->data = p2->data;
    			p2->data = temp;
    		}
    		p = p->next;
    	}
    }
    
      //打印链表信息
    void Print()
    {
    	LinkList* p = pHead;
    	while (p)
    	{		
    		printf("\n链表的值:%d 地址:%p 下一个地址:%p\n", p->data, p,p->next);
    		p=p->next;
    	}	
    }
    int main()
    {
    	Append(5);
    	Append(4);
    	Append(3);
    	Append(2);
    	Append(1);
    	Append(33);
    	Append(49);
    
    	//修改前
    	Print();
    
    	//修改后
    	//modify(33,500);
    	//Print();
    	//printf("链表的长度 %d\n",listLen());	
    	InsertNode(33, 1000);//插入一个节点
    	//deleteNode(33);//删除一个节点
    	//contentNode(33);//查询数据
    	Print();	
    	system("pause");
    }
    
    展开全文
  • 在做C语言课程设计的时候需求按字典排序新建职员,就是通过拼音进行排序 思路 创建双向链表 获取两个方向的节点与准备插入的节点的姓名属性做比较 需要注意:插入最后的话p->next = NULL,需要进行判断,...
  • C语言 链表数据的排序

    千次阅读 2021-02-25 22:04:49
    C语言使用链表时,有些时候会对链表中的数据进行排序。下边介绍使用链表时可用的排序方法,冒泡排序和选择排序。 此链表排序仅对链表中的数据进行排序,如果想进行对整个结构体的排序,也就是利用数据顺序来调整节点...
  • 做了两个链表 每个节点内有一个学生的编号和成绩,现在要求把两个链表合并,然后按照学号升序排列 不知道为啥 第65行总是报错 我整了一个小时了 没发现哪里错了,貌似运行时候显示说我引用了一个不可以引用的地址?...
  • p = p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/ { if (p->next->price < pmin->price) /*找到一个比当前min小的节点。*/ { pminBefore = p; /*保存找到节点的前驱节点*/ ...
  • C语言——链表排序

    2019-08-24 15:15:29
    交换节点:插入排序,冒泡排序,简单选择排序 交换数据:快速排序 初始化: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //节点结构 struct node { int val;...
  • C语言排序链表插入新节点保持排序状态C语言排序链表插入新节点保持排序状态完整源码(定义,实现,main函数测试) C语言排序链表插入新节点保持排序状态完整源码(定义,实现,main函数测试) #include <...
  • 在用C语言解决链表排序问题时,如果遇到字符串,采用交换数据域的方式来就比较困难,本文章介绍如何以交换节点的方式来实现链表排序。 废话不多直接上代码: struct STUDENT *xuehaopai(struct STUDENT *head) { ...
  • 下面将实现链表排序排序和遍历显示功能: 所定义的链表结构如下: head -&gt; p1 -&gt; p2 -&gt;p3 -&gt;....-&gt;pn; head的本身不作为数据节点,head-&gt;data保存结点个数. insert_...
  • C语言中,若想直接对链表进行排序或许有些复杂,而且一个节点中可能有多个键值,如果要对链表实现多个键值的排序则更加复杂。 考虑到这个问题的复杂性,我想到了之前学过的指针数组,令数组存储一系列指针,这些指针...
  • 本文实例为大家分享了C语言链表实现歌手评分系统的具体代码,供大家参考,具体内容如下 此程序可以添加文件操作用于保存歌手得分等信息,此程序实现了链表的增删查和链表冒泡排序交换节点功能 #include #include ...
  • C语言结构体链表排序方法汇总 ========================== 功能:选择排序(由小到大) 返回:指向链表表头的指针 ========================== */ /* 选择排序的基本思想就是反复从还未排好序的那些节点中, ...
  • C语言单向链表冒泡排序

    千次阅读 2019-01-05 12:03:42
    如题,复习期末时敲的,感觉敲的有点复杂 /* typedef struct List{ int i; struct List* next;...next==NULL) //如果链表为空或只有一个节点,直接返回 return head; if(head-&gt;next-&gt;...
  • 用冒泡法对链表进行排序时,采用交换值法,设置一个链表指针p,用来指向头结点后一个(head->next)(每次内层循环结束,则往后移动),p ->next用来继承当前p节点后一个,在内层循环中不断往后移动,期间满足交换...
  • 索性写写链表程序,直接上代码: #include<stdio.h>...//生成链表节点 void CreatNewNode(struct Node* Head,int lenth) { int i=0; for(i=0;i<lenth;i++) { struct Node* NewNode=(struct N
  • // 申请堆上数组存储链表节点指针 p = g_pHead; while (p) { ps[i] = p; p = p->pNext; ++i; } ps[i] = NULL; i = 0; while (i ) { int j = i + 1; int m = i; while (j ) { //if (ps[j]-...
  • // 链表节点指针 int n = 0, i = 0; while (p) { ps[n] = p; p = p->pNext; ++n; } while (i ) { int j = i + 1; int m = i; while (j ) { //if (ps[j]->data.nNumb [m]->data.nNumb) if...
  • 链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入,输出,排序,反序,清空链表等操作。 链表关键节点:头结点,尾节点...
  • (1) 从emp.dat文件中读出职工记录,并建立一个带头节点的单链表L; (2) 输入一个职工记录; (3) 显示所有职工记录; (4) 按编号no对所有职工记录进行递增排序; (5) 按部门号depno对所有职工记录进行...
  • 链表的各种操作 删除节点 增加节点 排序 查询 C语言
  • 标题//链表的创建,遍历,删除,插入,排序以及修改链表节点的值 #include"stdio.h" #include"malloc.h" typedef struct student { float score; struct student *next; }linklist; linklist *create_list(int n); ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 263
精华内容 105
关键字:

c语言链表节点排序

c语言 订阅