C语言数据结构——单链表

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre">	</span>数据结构的一些讲解,供学习者参考,也顺带作为复习     </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">        链表与顺序表不同,它是一种动态的存储结构,链表中每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部。下图为链表的构建过程,因为是在链表的头部插入,读入数据的顺序表和线性表的逻辑顺序是相反的。</span>


链表建立

LinkList Creat_LinkList()
{
	LNode *s;
	int x;
	printf("请输入数据(输入'0'表结束输入):\t");
	scanf("%d",&x);
	while(x!=0)
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=L;
		L=s;
		printf("请输入数据(输入'0'表结束输入):\t");
		scanf("%d",&x);

	}
	return L;
}

获取某个位置的数据

LNode *Get_LinkList(LinkList L,int i)
{
	LNode *p=L;
	int j=0;
	while(p->next!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	if(j==i)
		return p;
	else 
		return NULL;
}

定位到某个元素的结点

LNode *Locate_LinkList(LinkList L,int x)
{
	LNode *p=L->next;
	while(p!=NULL&&p->data!=x)
		p=p->next;
	return p;
}

插入算法1,i为插入的位置,x为插入的元素

int Insert_LinkList_1(LinkList L,int i,int x)
{
	LNode *p,*s;
	p=Get_LinkList(L,i-1);
	if(p==NULL)
	{
		printf("参数i错误\n");
		return 0;
	}
	else 
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=p->next;
		p->next=s;
		return 1;
	}
}

插入算法2:表头插入

LinkList Insert_LinkList_2(LinkList L,int x)
{
	LNode *s;
	s=(LNode *)malloc(sizeof(LNode));
	s->data=x;
	s->next=L;
	L=s;
	return L;
}

删除链表某个位置的元素
int Del_LinkList(LinkList L,int i)
{
	LinkList p,s;
	p=Get_LinkList(L,i-1);
	if(p==NULL)
	{
		printf("第i-1个结点不存在\n");
		return -1;
	}
	else if(p->next==NULL)
	{
		printf("第i个结点不存在\n");
		return 0;
	}
	else
	{
		s=p->next;
		p->next=s->next;
		free(s);
		return 1;
	}
}

计算链表的长度

int Length_LinkList(LinkList L)
{
	LNode *p=L;
	int j=0;
	while(p)
	{
		p=p->next;
		j++;
	}
	return j;
}

输出链表内的所有元素

void OutputList(LinkList L)
{
	LNode *p=L;
	while(p)
	{
		printf("%4d",p->data);
		p=p->next;
	}
}

主函数设计

void main()
{
	LinkList H=NULL;
	int item,model,addr;
	while(1)
	{
		printf("请选择操作:\n【1】创建链表\n【2】特定位置插入数据\n【3】表头插入数据\n【4】特定元素删除\n【5】表长度\n【6】查看链表\n【7】退出\n");
		printf("请输入:\t");
		scanf("%d",&model);
		fflush(stdin);
		switch(model)
		{
		case 1:
			H = Creat_LinkList();
			OutputList(H);
			break;
		case 2:
			while(1)
			{
				printf("请输入插入的位置\t");
				scanf("%d",&addr);
				if(addr==0)
					break;
				printf("请输入插入的数据\t");
				scanf("%d",&item);
				Insert_LinkList_1(H,addr,item);
			}
			OutputList(H);
			break;
		case 3:
			while(1)
			{
				printf("请输入插入的数据\t");
				scanf("%d",&item);
				if(item==0)
					break;
				H=Insert_LinkList_2(H,item);
			}
			OutputList(H);
			break;
		case 4:
			while(1)
			{
				printf("请插入删除的位置\t");
				scanf("%d",&addr);
				if(addr==0)
					break;
				Del_LinkList(H,addr);
			}
			OutputList(H);
			break;
		case 5:
			printf("%d\n",Length_LinkList(H));
			break;
		case 6:
			OutputList(H);
			printf("\n");
			break;
		case 7:
			exit(0);
		default:
			printf("输入有误,请重新输入\n");

		}
	}
}


运行程序图



需要源代码的欢迎下载,免积分,共同学习,家下来每天都会分享一篇,持续一个星期

http://download.youkuaiyun.com/detail/kevin_iot/9395889


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值