精华内容
下载资源
问答
  • 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语言的一种基础数据结构。...链表中的节点分为两类,头结点(head)和一般节点(node),最后一个节点也叫尾节点(end)。其中,头结点是没有数据域的,尾节点一般不再指向其他节点,如下图所示。一般节点...
    df911e7984b0f9b8ac2e95a935d2b902.png

    链表,是C语言的一种基础数据结构。

    链表可以动态地进行存储分配,因此可将其看做一个功能强大的数组,在节点中可以定义多种数据类型,还可以根据需要修改、增加、删除节点。

    链表都有一个头指针,一般以 head 来表示,存放的是一个地址。

    链表中的节点分为两类,头结点(head)和一般节点(node),最后一个节点也叫尾节点(end)。其中,头结点是没有数据域的,尾节点一般不再指向其他节点,如下图所示。

    fd1811e71075bab971de8600f2656352.png

    一般节点可分为两部分:数据部分和指针部分。数据部分用来存放该节点所包含的数据,指针部分用来指向下一个节点。

    链表的节点整体用结构体来定义,指针部分定义为指向本结构体类型的指针类型。

    链表就如同车链子一样,head指向第一个节点,第一个节点又指向第二个节点,以此类推,直到最后一个节点,该节点不再指向其它节点,它称为“表尾”,它的地址部分放一个“NULL”,表示“空地址”,到此结束。

    1、创建链表

    在创建链表时,一般都会用 typedef struct 来定义新的类型名,这样在定义结构体变量时就比较简单。

    创建链表的代码示例如下:

    7539bb4cb66c40e1e67c50dac363e163.png

    创建链表

    2、输出链表

    输出链表比较简单,遍历输出即可。如下图所示。

    0060f069b4358b197252966c0fb9172b.png

    运行上面的程序,比如创建了一个链表,里面包含3个节点,程序运行如下:

    2655896bcc3068f52b1625a3b875afe1.png

    3、修改节点

    修改链表中特定节点的值,如下图所示。

    43d3673b18ab647f205b981f0d5af94e.png

    4、增加节点

    增加节点就是把前节点的指针域链接上增加节点的数据域,再把增加节点的指针域链接上后节点的数据域。如下图所示。

    fce596b973e153775878bff4022e2a97.png

    增加节点

    5、删除节点

    比如删除链表的节点q,就是把前节点p的指针域越过要删除的节点q,直接指向下下个节点。

    即:p->next = q->next

    需要注意的是,一定要记得释放q节点的空间。

    bfb96b6cff8aa09de8ea89ca6c38a7a7.png

    删除节点

    相关阅读

    C语言的标准库介绍

    深入理解C语言的指针

    C语言 typedef 的两种用法

    展开全文
  • 链表的尾部动态添加节点,添加信息包括图书编号和价格。 //下面是动态添加节点的完整c代码(直接复制粘贴到main.c中就可以运行) #include<stdio.h> #include<stdlib.h> typedef struct book { int num...

    在链表的尾部动态添加节点,添加信息包括图书编号和价格。

    //下面是动态添加节点的完整c代码(直接复制粘贴到main.c中就可以运行)
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct book
    {
    	int num;				//图书编号
    	float price;			//图书价格
    	struct book *next;		//指向下一个节点的指针
    }Book;
    Book *head=NULL;			//初始化头指针为空
    int n=0;					//总节点数目
    
    //动态添加节点
    void Create()
    {
    	Book *p=NULL;				//用于遍历链接
    	Book *p_new=NULL;			//存储新节点的地址
    	Book *p_old=NULL;			//存储尾节点的地址
    	int num;				//接收用户输入的编号
    	if (head!=NULL)
    	{
    		p=head;
    		while (p!=NULL)
    			p=p->next;
    		p_old=p;			//循环到结束时,将尾节点地址保存
    	}
    	while (1)
    	{reInput:
    		printf("请输入图书编号,按0结束:");
    		scanf("%d",&num);
    		if (num==0)
    		{
    			getchar();		//抛弃多余的Enter键
    			break;
    		}
    		p=head;				//获得头指针,用于遍历
    		while (p!=NULL)
    		{
    			if (p->num==num)
    			{
    				printf("编号重复,请重新输入。\n");
    				goto reInput;
    			}
    			p=p->next;		//取下一个节点的地址
    		}
    		p_new=(Book*)malloc(sizeof(Book));	//创建新节点
    		p_new->num=num;		//保存编号
    		n++;				//总节点数+1
    		if (n==1)
    		{
    			head=p_new;
    		}
    		else
    		{
    			p_old->next=p_new;
    		}
    		p_old=p_new;
    		p_new->next=NULL;
    		printf("请输入图书价格:");
    		scanf("%f",&p_new->price);
    	}
    }
    
    //显示所有节点数据
    void Show()
    {
    	Book *p;
    	p=head;
    	if (p==NULL)
    	{
    		printf("没有图书信息。\n");
    		return;
    	}
    	printf("图书编号\t图书价格\n");
    	while (p!=NULL)
    	{
    		printf("%d\t\t%.2f\n",p->num,p->price);
    		p=p->next;
    	}
    }
    int main()
    {
    	Create();//动态添加节点
    	Show();//显示所有节点数据
    	return 0;
    }
    
    
    展开全文
  • C语言链表实现链表节点struct 往链表的节点添加一个节点void 在链表中找到第一个含有某值的节点并删除该节点的代码void 面试题:从到头打印链表struct 接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是...

    b2db00f106ffebfb1f4589040161ee94.png

    C语言链表实现

    链表节点

    struct 

    往链表的节点添加一个节点

    void 

    在链表中找到第一个含有某值的节点并删除该节点的代码

    void 

    面试题:从尾到头打印链表

    struct 
    接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“后进先出”,我们可以用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。这种思路的实现代码如下:
    void 
    既然想到了用栈来实现这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
    void 
    展开全文
  • C语言链表

    2019-03-16 17:52:34
    C语言链表 链表是一个非常重要的数据结构。更数组相比,它更加的灵活。关于链表的基本操作有: 创建(头插 和 尾插方法) 插入 删除 1、链表的创建之尾插法 首先,尾插法的方法创建。 tail-&gt;next = newPtr;...
  • c语言链表

    2017-11-16 12:51:27
    每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。 链表相对数组要消耗更多cpu资源,因为它要通过指针一个一个去查找对应节点,而数组只要通过下标就可以找到对应元素...
  • #include<stdio.h> #include<stdlib.h> //节点结构体 struct Node{ int m; struct Node* pNext; }; //链表头尾指针 struct Node* g_pHead = ...//创建链表,在链表中增加一个数据(添加) void ...
  • #include<stdio.h> #include<stdlib.h> //节点结构体 struct Node { int a; struct Node* pNext; }; //链表头尾指针 struct Node* g_pHead = ...//创建链表,在链表中增加一个数据(添加) vo...
  • C语言链表详解

    2018-08-28 21:00:14
      尾节点:存放最后一个有效数据的节点;  头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。  头指针:指向头...
  • /*******************************************************************************************************************************************************************... 创建的步骤:1、定义链表结构体(...
  • 很久没有用过链表,发现现在只记得思路,代码的编写已经忘得七七八八,写一篇博客回忆一下。 链表是一种常见的基础...链表关键节点:头结点,尾节点,一般节点。 头结点是为了处理空表的方便所引用的,用来存放链...
  • #include<stdio.h> #include<stdlib.h> //节点结构体 struct Node { int a; struct Node* pNext; }; //链表头尾指针 struct Node* g_pHead = ...//创建链表,在链表中增加一个数据(添加) vo...
  • 头结点和结点 typedef struct list{//链表 Node* head; Node* tail; }List; 基本链表 存入一连串整数遇到-1结束 #include #include //节点声明 typedef struct _node{ int value; struct _node *next; }...
  • c语言 链表

    2007-09-06 10:39:00
    /***********************************************//*链表的删除:三种情况,头节点,中节点,尾节点/*/*selection_sort()遍历整个连表,并找出最大值/* 9-5-2007/***********************************************...
  • C语言链表有单链表、双向链表、循环链表。单链表由数据域和指针域组成,数据域存放数据,指针域存放该数据类型的指针便于找到下一个节点。双链表则含有头指针域、数据域和指针域,域单链表不同,双链表可以从后一...
  • C语言链表操作(一)

    2020-05-28 08:55:40
    刚学过链表的大一萌新对链表相关操作的梳理。留作复习用。(菜鸟的第一篇博客哈) (一)链表的创建 模板: typedef struct node ...(数据域:用来存放...//(r为指针,始终指向链表尾部,以便新节点的插入) .
  • 首节点没有前驱节点 尾节点没有后驱节点 注意了解首节点,尾节点,头结点,头指针,尾指针各个术语的含义 头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针 头指针具有标识...
  • #include<stdio.h> #include<...//节点结构体 struct Node { int a; struct Node* pNext; }; //链表头尾指针 struct Node* g_pHead = NULL; struct Node* g_pEnd = NULL; ...
  • @[TOC]1....只能从头遍历到或者从遍历到头(一般从头到尾)双向链表特点  1.每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 实现起来要困难一些  2.相对于单向链表, 必然占用...
  • 首节点没有前驱节点 尾节点没有后驱节点 注意了解首节点,尾节点,头结点,头指针,尾指针各个术语的含义 头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针 头指针具有标识...
  • c语言实现带头结点和尾节点的双向链表 接口参考严蔚敏老师的数据结构 编译环境:linux 数据结构 : typedef struct LNode { Item data; struct LNode *prior; struct LNode *next; }Link; typedef struct...
  • 我在之前一篇博客《C语言实现非循环双链表节点的删除(不带头结点)》中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦。自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便。代码...
  • #include #include #include #define LEN sizeof...//初始化链表 struct Student{ long num; float score; struct Student *next; }; int n; struct Student* creat(void){ //定义函数,返回一个执行链表头的指

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 292
精华内容 116
关键字:

c语言链表尾节点

c语言 订阅