不带头节点的链表的不带头结点的链表,仅供参考

实验二 附上一段代码,供参考
/*
 * 头结点存储数据,即不带头结点的链表
 */
#include <stdio.h>
#include <stdlib.h>

#define OverFlow -1  //定义OverFlow表示内存溢出
#define OK        0  //定义OK表示成功
#define Error    -2  //定义操作失败的返回值

/* 
 * 首先定义一个数据类型int的别名ElemType,
 * 增强程序的可移植性,注意typedef和define的区别
 */
typedef int ElemType;
/*
 * 紧接着定义链表的节点,其实就是>=1个包含数据
 * 的元素(类型任意)和一个本结构体类型的Next指
 * 针(其值指向链表的下一个节点的地址)
 */
typedef struct node
{
	ElemType data;
	struct node *next;
} Node, *LinkList; 
/*
 * 1.构建头结点不存储数据的空表(相对简单)
 * 注意函数参数传递的原理
 */
void Init_LinkList(LinkList *Head_pointer) 
{
	*Head_pointer = NULL;
}
/*
 * 2.插入一个元素(头插)
 * 这时候不需要传入位置的数据,只需要传入头指针和数据
 */
int Insert_First(LinkList *Head_pointer, ElemType x)
{
	Node *p; //这里考虑为什么不用LinkList
	p = (Node *) malloc(sizeof Node);
	if (p == NULL)
		return OverFlow;
	p->data = x;
	
	p->next = *Head_pointer;
	*Head_pointer = p;
	
	return OK;
}
/* 
 * 3.查找指定元素,注意这里用到了LinkList定义数据
 * 因为不是要定义一个节点,只是定义一个指针
 */
LinkList Location_LinkList(LinkList Head, ElemType x)
{
	LinkList p;
	p = Head;
	while(p != NULL)
	{
		if (p->data == x)
			break;
		p = p->next;
	}
	return p;
}
/*
 * 4.删除指定的元素
 * 有可能改变头结点的值,所以要传入指针
 * 对头结点就是要删除的元素进行单独处理
 */
int Delete_LinkList(LinkList *Head_pointer, ElemType x)
{
	Node *p, *q;
	p = *Head_pointer;
	if (p->data == x)//考虑头结点就是要删除的元素
	{
		*Head_pointer = (*Head_pointer)->next;
		free(p);
		return OK;
	}
	else
	{
		q = p; p = p->next; //q指向前一个节点,p指向下一个节点
		while(p != NULL)
		{
			if (p->data == x)
			{
				q->next = p->next;
				free(p);
				return OK;
			}
			q = p; p = p->next;
		}
	}
	return Error;
}
/*
 * 5.遍历线性表,打印每个数据
 * 只需要传入Head的值即可
 * 头结点为空需要打印空表,在linux的超级终端下注意中文编码问题
 */
void Show_LinkList(LinkList Head)
{
	LinkList p = Head;
	int i = 0;
	printf("----链表打印----\n");
	if (p == NULL) //处理头结点为空的情况
		printf("空表\n");
	while (p != NULL)
	{
		printf("[%d]:%d\t", i++, p->data);
		p = p->next;
	}
}
/*
 * 6.清空链表
 * 清除到头结点为空的状态,也就是一个空表的状态
 */
void SetNull_LinkList(LinkList *Head_pointer)
{
	LinkList p, q;
	p = *Head_pointer;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
}

// 注意算法:从Head计算,指针不为空的总数 
/* 
* 7.计算链表的长度 
* 计算方法:从Head开始,计算指针不为空的个数 
*/ 
int Length_LinkList(LinkList Head) 
{ 
	LinkList p = Head; 
	int sum = 0; 
	while(p != NULL) 
	{ 
		sum++; 
		p = p->next; 
	} 
	return sum; 
} 

/*
 *8.调用单链表操作的主函数
 */
int main(void)
{
	LinkList Head;
	int i;
	Node *loca;
	ElemType x;
	
	Init_LinkList(&Head);
	do
	{
		printf("\n");
		printf("1---插入一个元素(Insert)\n");
		printf("2---查询一个元素(Locate)\n");
		printf("3---删除一个元素(Delete)\n");
		printf("4---显示所有元素(Show)\n");
		printf("5---计算表的长度(Length)\n");
		printf("6---退出\n");
		scanf("%d", &i);
		switch (i)
		{
			case 1:	printf("请输入要插入的分数:\n");
					scanf("%d", &x);
					if (Insert_First(&Head, x) != OK)
						printf("插入失败\n");
					break;
					
			case 2:	printf("请输入要查询的分数\n");
					loca = Location_LinkList(Head, x);
					if (loca != NULL)
						printf("查询成功\n");
					else
						printf("查询失败\n");
					break;
					
			case 3:	printf("请输入要删除的分数\n");
					scanf("%d", &x);
					if (Delete_LinkList(&Head, x) != OK)
						printf("删除失败\n");
					else
						printf("删除成功\n");
					break;
					
			case 4:	Show_LinkList(Head);
					break;
					
			case 5:	printf("表的长度是:%d", Length_LinkList(Head));
					break;
					
			case 6:	break;
			
			default:	printf("错误选择!请重选");
						break;
		}
	} while (i != 6);
	
	SetNull_LinkList(&Head);
	printf("链表已清空,程序退出...\n");
	
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值