`

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

阅读更多

单链表的创建、计数打印、删除节点、增加节点和逆序操作,是在上一篇的基础上完善了逆序操作,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
分享到:
评论

相关推荐

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

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

    c语言经典案例

    实例206 单链表节点逆置 298 实例207 应用栈实现进制转换 300 实例208 用栈实现行编辑程序 303 实例209 用栈设置密码 306 实例210 括号匹配检测 310 实例211 用栈及递归计算多项式 313 实例212 链队列 315 实例213 ...

    leetcode145-Algorithm:数据结构与算法学习

    求中序遍历某节点的前驱和后继节点 堆 最大堆实现 最小堆实现 排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序 堆排序 计数排序 基数排序 荷兰国旗问题(partition) 最小和问题(MergeSort) 逆序对个数...

    算法设计与分析 期末1

    引入决策树,说明算法结果需要一步一步走到叶节点,从而证明,比较排序的最坏情况时间复杂度的下界:逆序对及计数计算逆序对数,可以在归并排序中顺便完成long lon

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型应用和数据库...

    ORACLE9i_优化设计与系统调整

    §13.2 创建索引和使用索引 165 §13.2.1 使用函数索引 165 §13.2.2 使用位图索引- 166 §13.2.3 使用B树索引- 166 §13.2.4 使用反向键索引- 166 §13.2.5 使用索引组织表 166 §13.3 使用范围索引 166 §13.4 ...

    ACM算法模板和pku代码

    本科参加ACM竞赛的过程中积累下来的一部分算法模板,和自己在PKU上面做的一部分题目。 模板目录结构: 目录: 动态规划 O(n^2)的最长上升子序列 nlogn最长上升子序列 高精度 计算几何 Graham扫描法 两线段交点 凸...

    Java开发技术大全(500个源代码).

    GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 ...

    leetcode中文版-FDSS_Algorithm:2020复旦大学软件/计算机保研机考:算法与数据结构总复习(让我看看是谁偷偷clone却

    数组逆序对计数 快速幂的板子题,输入a,b,c,输出pow(a,b)%c的值 组合数的经验题,输入一个n,输出组合数集合C(0,n) ,C(1,n) ,..., C(n,n)~ 中共有多少奇数。(第k个组合数与n异或后仍为k的个数) 奶牛吃草的问题...

Global site tag (gtag.js) - Google Analytics