`

单链表的创建、计数打印、删除节点、增加节点和逆序操作

阅读更多

单链表的创建、计数打印、删除节点、增加节点和逆序操作,是在上一篇的基础上完善了逆序操作,gcc编译通过。

 

#include<stdio.h>
#include<stdlib.h>  /*使用到其中的malloc和exit函数*/
#define times 4  /*用于循环次数的控制*/

static int N=4;  /*静态全局变量,用于控制单链表长度*/

typedef struct _person
{
	char name[12];
	int age;
	struct _person *next;
}stud;

stud *Create(int num)  /*创建单链表的函数,num为单链表的长度*/
{
	int i;
	stud *h,*p,*q;  /* h为头指针,指向单链表的第一个节点*/
	h=(stud*)malloc(sizeof(stud));
	if(h!=NULL)
	{
		p=h;
		for(i=0;i<num;i++)
		{
			q=(stud*)malloc(sizeof(stud));  /* q为指向新建节点的指针*/
			if(q!=NULL)
			{
				printf("依次输入第%d个人的姓名和年龄:\n",i+1);
				scanf("%s%d",q->name,&q->age);
				q->next=NULL;  /*创建新节点完毕*/
				p->next=q;
				p=q;
			}
		}
	}
	printf("\n");
	return(h);
}

stud *Delete(stud *person,int post)  /*删除单链表指定位置节点的函数*/
{
	int i;
	stud *cur,*pre;
	cur=person;

	if(0==post)  /*如果输入的值为0,则不删除任何节点*/
	{
		printf("\n注意:您决定不删除任何节点!!!\n\n");
		return(person);
	}
	else if(post>N||post<0)  /*如果输入的值大于单链表长度或者小于0,程序结束*/
	{
		printf("输入有误,程序终止。\n");
		exit(1);
	}
	else
	{
		if(1==post)  /*在单链表头部删除的情况*/
		{
			cur=cur->next;
			person->next=cur->next;
			free(cur);
		}
		else  /*在其它位置删除的情况*/
		{
			for(i=2;i<post+1;i++)  /*使pre成为要插入位置的上一位置的节点*/
			{
				cur=cur->next;
				pre=cur;
			}
			cur=cur->next;
			pre->next=cur->next;
			free(cur);
		}
		return(person);
	}
}

stud *Insert(stud *person,int post)  /*在单链表指定位置插入新的节点的函数*/
{
	int i;
	stud *cur,*pre,*node;
	
	if(post>N+1||post<1)  /*如果输入的值大于单链表长度加1或者小于1,程序结束*/
	{
		printf("输入错误,程序终止。\n");
		exit(1);
	}

	if(person!=NULL)
	{
		cur=person;
		node=(stud*)malloc(sizeof(stud));
		if(node!=NULL)
		{
			printf("请输入新人的姓名和年龄:\n");
			scanf("%s%d",node->name,&node->age);  /*为新的节点输入数据内容*/

			if(1==post)
			{
				node->next=person->next;
				person->next=node;
			}
			else
			{
				for(i=2;i<post+2;i++)
				{
					pre=cur;
					cur=cur->next;
				}
				node->next=pre->next;
				pre->next=node;
				
			}
		}
	}
	printf("\n");
	return(person);
}

stud *Reverse(stud *person)  /*对单链表进行逆序操作的函数*/
{
	stud *cur,*tmp;  //cur将代表逆序后单链表的第一个节点
		  	 //tmp代表原单链表中cur之后紧邻的节点,起交换作用

	if(person!=NULL)
	{
		cur=person->next;
		person->next=NULL;  /*将原单链表置空*/
		
		while(cur!=NULL)  /*如果cur不为NULL*/
		{
			tmp=cur->next;  /*把当前节点的下一个节点赋给tmp */
			cur->next=person->next;  //若当前节点为原链表中的第一个节点,则使其next指向NULL
						 //否则使其next指向原链表中当前节点的上一个节点,也就是正在逆序中的第一个节点
			person->next=cur;  /*使头指针指向当前节点*/
			cur=tmp;  /*把原cur的下一个节点赋给cur*/
		}
		
	}
	return(person);
}

void Print(stud *person)
{
	int post=1;
	stud *cur;
	cur=person->next;
	printf("当前的节点信息如下所示:\n");
	while(cur!=NULL)
	{
		printf("第%d个人的姓名是:%s,年龄为:%d\n",post,cur->name,cur->age);
		cur=cur->next;
		post++;
	}
	N=--post;
	printf("当前单链表的长度是:%d\n\n",N);
}

int main()
{
	int number,post,i;
	stud *head;
	head=Create(N);
	Print(head);

	for(i=0;i<times;i++)
	{
		printf("请输入要删除的节点的位置:\n");
		scanf("%d",&number);
		Delete(head,number);
		Print(head);

		printf("请输入要插入节点的位置(此位置是指预期插入成功后新节点在单链表中的位置):\n");
		scanf("%d",&post);
		Insert(head,post);
		Print(head);
	
		printf("以下展示了两次单链表的逆序!!!\n\n");
		Print(Reverse(head));
		Print(Reverse(head));
	
		printf("\n注意:剩余输入轮数为:%d  !!!!!\n\n",(times-(i+1)));
	}

	return 0;
}
 

 

 

 

调试环境:Ubuntu Desktop 8.04.4     VI 7.1.138    GCC 4.2.4
QQ:81064483
E-mail:AllenNewOK@126.com

不足之处,欢迎指正。< ^_^ >

 

0
0
分享到:
评论

相关推荐

    danlianbiao.rar_单链表的操作_链表降序

    单链表是一种基础的数据结构,它由一系列节点构成,每个节点包含数据元素和指向下一个节点的指针。在本主题中,"danlianbiao.rar_单链表的操作_链表降序" 提到了单链表的一系列操作,包括创建、查询、修改以及对链表...

    单链表的创建,排序,归并,插入删除定位和获得元素,计算元素个数,打印链表

    创建单链表通常从创建头节点开始,头节点不存储任何数据,仅用于链接其他节点。之后,我们可以按需添加节点到链表的末尾或特定位置。例如,创建一个空链表可以这样实现: ```c typedef struct Node { int data; ...

    这是Kotlin语言版本的 Android 客户端本地化算法展示 Java 语言编写的面试算法_kotlin_代码_下载

    删除单链表和双链表倒数第K个节点 删除链表的中间节点和a/b处的节点 腕单向链表和链 部分单向链表 环形单链表的约瑟夫问题 一个鉴定链表是否为回文结构 将单向链某值分割成小表、送、按右边大的形式 复制带有日常...

    顺序链表C语言实现代码

    本主题聚焦于顺序链表(单链表)的C语言实现,包括正序创建、逆序创建、输出、删除、插入节点、求链表长度以及合并链表等操作。 1. **链表的基本概念**:链表由一系列节点组成,每个节点包含数据和指向下一个节点的...

    计算机软件技术基础上机编程.pdf

    总结起来,这篇文档涵盖了单链表的基本操作,包括创建、输出、计算长度、删除节点和倒序,以及二叉树的构建概念。这些是数据结构基础课程中的核心内容,对于理解计算机科学中的数据存储和处理至关重要。通过实际编程...

    SINGLY-LL.rar_The Program

    与数组不同,链表的元素在内存中不是连续存储的,这使得插入和删除操作相对高效,但随机访问效率较低。 在`SINGLY LL.cpp`这个文件中,我们可以预见到代码将实现以下功能: 1. **链表节点定义**:首先,会定义一个...

    C++链表基本操作.doc

    本篇文章将详细讲解C++中链表的基本操作,包括创建、计数、查找、输出、清空、逆序等。 首先,链表的节点结构定义如下: ```cpp struct Node{ int num; Node *next; }; ``` 其中,`num` 是节点存储的数据,`next`...

    双循环链表 (c++)

    在C++中,可以创建一个DulList类来封装这些操作,类中包含节点结构体,插入、删除、转置等成员函数,以及头节点和尾节点的指针。通过实例化这个类,可以方便地管理和操作双循环链表。 总的来说,双循环链表是一种...

    单向链表基本操作的递归实现

    总结来说,这个博客文章介绍了如何使用递归实现单向链表的基本操作,包括计数、打印、删除和查找元素。这些操作展示了递归思想在解决链表问题中的应用,同时也提醒我们在实际编程时需要权衡代码的简洁性和执行效率。

    C语言对链表的基本操作

    一个简单的单链表节点结构可以定义为: ```c typedef struct Node { int data; // 数据域 struct Node* next; // 指针域,指向下一个节点 } Node; ``` 2. **初始化链表** 初始化链表通常意味着创建一个空...

    实用单向链表的基本操作函数24个C语言版

    9. **计算链表长度**:通过遍历链表并计数节点数量来得到链表的长度。 10. **排序链表**:对于数值型链表,可以应用各种排序算法(如冒泡、插入、快速等)对其进行排序。 11. **分裂链表**:根据特定条件(例如,...

    清华大学数据结构参考答案

    // 取得单链表中第i个节点地址,i从0开始计数,i时返回指针0,i=0时返回表头节点地址。 if (i ) return NULL; ListNode* p = first; int k = 0; while (p != NULL && k ) { p = p-&gt;link; k++; } return p; } ```...

    线性表的链式存储结构

    4、插入一个新元素X到指定位置i:插入操作需要找到插入位置i-1的节点,然后创建一个新节点,将新节点的数据域设置为X,其next指针指向原位置i的节点,同时原位置i-1的节点的next指针更新为新节点。这样,元素X就被...

    数据结构线性表综合习题PPT学习教案.pptx

    8. 顺序表的移动次数:插入和删除操作平均需要移动n/2个节点,具体移动次数取决于插入或删除的位置以及表的当前状态。 9. 栈的序列操作:栈具有后进先出(LIFO)特性,根据这个性质,可以判断哪些序列是可能的出栈...

    算法-理论基础- 排序- 逆序对问题(包含源程序).rar

    在调整堆的过程中,如果父节点比子节点大,我们就可以增加逆序对的计数。 除了与排序算法结合,逆序对问题还常用于数据结构设计,如二叉搜索树、平衡二叉树等。例如,在AVL树或红黑树的平衡调整过程中,逆序对的...

    敢死队问题

    初始化:创建单链表,包括排长节点及其后的第一个士兵节点。 2. 插入节点:依次插入剩余的士兵节点,并设置它们的`data`值。 3. 执行任务:从第一个节点开始计数,每数到5则选出一名士兵执行任务,并输出该士兵的...

    C++链表基本操作大全

    在本文中,我们将详细介绍C++链表的基本操作,包括链表的创建、插入、删除和释放。 链表的创建 链表的创建是指在内存中动态地分配内存空间,以存储链表的节点。链表的创建可以通过使用new操作符来动态地分配内存...

    FP-Tree-java-code

    为了节省空间,可以删除这些节点,仅保留计数大于1的节点,同时更新父节点的计数。 6. **挖掘频繁项集**:从FP-Tree的根节点开始,沿着路径向下遍历,记录每个路径上的频繁项,形成一个候选集。然后,通过检查逆序...

    腾讯校园招聘C语言笔试题.docx

    栈方法则是将链表的所有节点压入栈中,然后逐个弹出并打印,栈的特性使得最后压入的节点最先弹出,从而达到逆序输出的效果。 2. 二叉树的深度计算: 二叉树的深度是指从根节点到最远叶节点的最长路径上的边数。...

Global site tag (gtag.js) - Google Analytics