数据结构之——链表的基本操作

链表的基本操作,可以实现以下功能:


代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
typedef struct node
{
	DataType data;
	struct node *next;
}LNode,*LinkList;

LinkList Create_LinkList()
{
	LinkList H;
	H = (LinkList)malloc(sizeof(LNode));

	if(H)
		H->next = NULL;

	return H;
}

void Destory_LinkList(LinkList *H)
{
	LinkList p,q;
	p = *H;

	while(p)
	{
		q = p;
		p = p->next;
		free(q);
	}

	*H = NULL;
}

int Length_LinkList(LinkList H)
{
	LinkList p = H;
	int count = -1;

	while(p)
	{
		p = p->next;
		count++;
	}

	return count;
}

LinkList Locate_LinkList_Pos(LinkList H,int i)
{
	LinkList p = H;
	int j = 0;

	while(p && (j < i))
	{
		p = p->next;
		j++;
	}
	if((j != i) || !p)
	{
		printf("参数i错误或单链表不存在\n");
		return NULL;
	}

	return p;
}

int Locate_LinkList_Value(LinkList H,DataType x)
{
	LinkList p = H->next;
	int n = 0;

	while(p && (p->data != x))
	{
		p = p->next;
		n++;
	}

	if(p == NULL)
	{
		printf("单链表不存在\n");
		return 0;
	}

	printf("该值序号为%d\n",n);
	return 0;
}

int Insert_LinkList(LinkList H,int i,DataType x)
{
	LinkList p,q;
	p = Locate_LinkList_Pos(H,i - 1);

	if(!p)
	{
		printf("i有误\n");
		return 0;
	}

	q = (LinkList)malloc(sizeof(LNode));
	if(!q)
	{
		printf("节点申请失败\n");
		return 0;
	}

	q->data = x;
	q->next = p->next;
	p->next = q;
	return 0;
}

void Delete_LinkList(LinkList H,int i)
{
	LinkList p,q;

	if((H == NULL) || (H->next == NULL))
	{
		printf("链表不存在或者空表不能删除\n");
		return;
	}

	p = Locate_LinkList_Pos(H,i-1);
	if((p == NULL) || (p->next == NULL))
	{
		printf("参数i错误\n");
		return;
	}

	q =p->next;
	p->next = q->next;
	free(q);
	printf("删除成功\n");
}

void print(LinkList H)
{
	LinkList q = H;
	printf("输出为:");
	if(q)
	{
		q = q->next;
		printf("%d ",q->data);
	}
	printf("\n");
}

int main()
{
	int n;
	int len;
	int i;
	int x;

	LinkList p,H;
	H = (LinkList)malloc(sizeof(LNode));
	p = (LinkList)malloc(sizeof(LNode));

	while(1)
	{
		printf("1.初始化链表\n");
		printf("2.销毁链表\n");
		printf("3.求表长\n");
		printf("4.按序号查找\n");
		printf("5.按值查找\n");
		printf("6.插入\n");
		printf("7.删除\n");
		printf("8.输出链表\n");
		printf("9.退出程序\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1: H = Create_LinkList();
					break;
			case 2: Destory_LinkList(&H);
					break;
			case 3: len = Length_LinkList(H);
					printf("表长为:%d\n",len);
					break;
			case 4: printf("输入要查找的序号\n");
					scanf("%d",&i);
					p = Locate_LinkList_Pos(H,i);
					printf("查找的值:%d\n",p->data);
					break;
			case 5: printf("输入要查找的值\n");
					scanf("%d",&x);
				    Locate_LinkList_Value(H,x);
				    break;
			case 6: printf("输入要插入的值\n");
				    scanf("%d",&x);
				    printf("输入要插入的序号\n");
				    scanf("%d",&i);
				    Insert_LinkList(H,i,x);
				    break;
			case 7: printf("输入要删除的序号\n");
				    scanf("%d",&i);
				    Delete_LinkList(H,i);
				    break;
			case 8: print(H);
					break;
			case 9: return 0;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值