数据结构----纯C语言实现线性表的单向链式存储结构

单向链表有如下优点:

1.插入,删除元素无需移动其他元素

2,.无多余元素存储空间

同样也有缺点:

1.节点指针域占用额外存储空间;

2.访问第i 号节点必须从头结点出发效率低

代码如下:

/*
	1.程序是用纯C语言编写
	2.为方便数据的类型仅仅用了int类型,排序等需要比较的算法若用其它数据类型则应该修改对应得程序,当然也可以
	将算法改造为适应多种类型的算法,如upsort函数传入一个比较函数LT()的函数指针,则可在算法中直接应用,比较不同
	的数据类型,只需修改相应的比较算法。
*/
//线性表的链式存储结构
#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
typedef struct node
{
	int data;//这里只测试int类型的数据
	struct node *next;
}LNode, *LinkList;
LinkList create()//创建链表方法一,元素先入先出法
{
	LinkList h = (LinkList)malloc(sizeof(LNode));	//附加头结点
	LinkList last = h;
	int e;
	while(1)
	{
		scanf("%d", &e);
		if(e==0)	//若输入为0,输入终止
			break;
		last->next = (LinkList)malloc(sizeof(LNode));
		last->next->data = e;
		last = last->next;
	}
	last->next = NULL;
	return h;
}
void print(LinkList h)//打印链表的内容
{

	LinkList p = h->next;	//h指向第一个存储数据的node
	while(p)
	{
		printf("%d  ", p->data);
		p = p->next;
	}
}
void insert(LinkList h, int d, int e)//插入到第一个数据为e之前
{
	LinkList pr, p;
	pr = p = h;
	while(p)
	{
		p = p->next;
		if(p->data == e)
		{
			pr->next = (LinkList)malloc(sizeof(LNode));
			pr = pr->next;
			pr->data = d;
			pr->next = p;
			break;
		}
		pr = p;
	}
	if(pr == NULL)
		printf("找不到插入位置!");
}
void clear(LinkList h)
{
	LinkList p = h->next;
	h->next =  NULL;
	LinkList q;
	while(p)
	{
		q = p;
		p = p->next;
		free((void *)q);	//释放节点内存
	}
}
void del(LinkList h, int e)	//删除值为e的所有节点,O(n)
{
	LinkList q , p;
	q = h;	//总是指向当前节点的前一个节点
	p = h->next;
	while(p)
		if(p->data == e)
		{
			q->next = p->next;
			free((void *)p);
			p = q->next;
		}
		else
		{
			q = p;
			p = p->next;
		}
	
}
void reverse(LinkList h)//链表内容反转,时间复杂度O(n)
{
	LinkList q, p;
	q = h->next;
	h->next = NULL;
	while(q)
	{
		p = q;
		q = q->next;	//去下节点,用p指向
		p->next = h->next;
		h->next = p;	//插入到 p节点之前
	}
}
void upsort(LinkList h)//给链表升序排序
{
	LinkList q = h->next;	//断开头结点
	h->next = NULL;	
	while(q)	//依次取下节点并插入升序链表
	{
		LinkList s = q;	//摘下节点s
		q = q->next;
		LinkList pr = h;//初始化主从动指针
		LinkList p = h->next;
		while(p&&(p->data < s->data))	//寻找插入位置
		{
			pr  = p;
			p = p->next;
		}
		pr->next = s;	//将节点s插入升序链表中
		s->next = p;
	}
}
void merge(LinkList ha, LinkList hb, LinkList hc)
{
	LinkList pa, pb, pc, p;
	pa = ha->next;
	pb = hb->next;
	pc = hc;
	while(pa&&pb)
		if(pa->data < pb->data)
		{
			p = pa;
			pa = pa->next;
			pc->next = p;
			pc = p;
		}
		else
		{
			p = pb;
			pb = pb->next;
			pc->next = p;
			pc = p;
		}
		if(pa)	pc->next = pa;
		if(pb)  pc->next = pb;
		
}
void destroy(LinkList h)	//摧毁链表
{
	LinkList p = h;
	while(p)
	{
		p = p->next;
		free((void *)h);
		h = p;
	}
}
int main()
{
	LinkList h = create();	//创建
	print(h);				//打印
	printf("\n");
	//测试插入算法
	/*
	int d, e;
	scanf("%d%d", &d, &e);
	insert(h, d, e);
	print(h);
	*/
	//测试删除算法
	/*
	int d1;
	scanf("%d", &d1);
	del(h, d1);
	print(h);
	*/
	//测试颠倒算法
	/*
	reverse(h);
	print(h);
	*/
	//测试升序算法
	/*
	upsort(h);
	print(h);
	*/
	LinkList a = create();
	print(a);
	upsort(h);upsort(a);
	LinkList c = create();
	merge(a, h, c);
	print(c);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值