数据结构-单链表的实现

1.数据结构中,单链表也是很重要的一部分,单链表,顾名思义,就是像链子一样连接在一起的表。但是链表不一定都是连续存储的,它是通过一组地址任意存储单元存放线性表的数据元素,把存储单元称作一个节点。

2.(类别)链表可以分为单链表,双链表还有双向循环链表,这三种链表的实现特征是相同的,但是中间还是有一些不同,今天我就把我所学到的单链表的知识分享给大家。

3.(与顺序表的区别)单链表不同于顺序表的地方在于,单链表有两个域,一个是数据域,里面存放的是数据,而另一个是指针域,也就是指向下一个元素的地址,只有这样,一个链表才可以被连接起来。单链表可以带头结点也可以不带头结点,这两点的不同就在于,如果带头结点的话,它的头结点为空,而头结点的next指向第一个元素,这点没有什么区别。

4.(单链表的建立)单链表的实现和顺序表也是很类似的,需要先定义一个结构体,然后再初始化开辟一块空间,随后进行空链表的数据插入,在插入之后也可以执行删除操作,因为单链表也是在堆上开辟的动态空间,所以一定要记得释放空间,不然很有可能会造成内存空间的丢失,更可怕的,还有可能形成野指针,这会给程序的编写造成很大的麻烦,下面我就把代码附上。

5.(代码实现)

#include<stdio.h>    //头文件
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;

typedef struct Node
{
	DataType data;
	struct Node *next;
}SLNode;

void ListInitiate(SLNode **head)  //初始化单链表
{
	*head=(SLNode*)malloc(sizeof(SLNode));
	(*head)->next =NULL;
}

int ListLength(SLNode *head)//计算长度
{
	SLNode *p=head;
	int size=0;

	while(p->next !=NULL)
	{
		p=p->next;
		size++;
	}
	return size;
}

int ListInsert(SLNode *head,int i,DataType x)//插入数据
{
	SLNode *p,*q;
	int j;

	p=head;
	j=-1;
	while(p->next!=NULL &&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(j!=i-1)                   //判断插入位置是否合法
	{
		printf("插入位置参数错!");
		return 0;
	}
	q=(SLNode*)malloc(sizeof(SLNode));
	q->data=x;

	q->next=p->next;
	p->next=q;
	return 1;
}

int ListDelete(SLNode *head,int i,DataType *x)//删除函数
{
	SLNode *p,*s;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL &&p->next->next !=NULL && j<i-1)
	{
		p=p->next;
		j++;
	}

	if(j!=i-1)                           //判断删除位置是否合法
	{
		printf("删除位置参数错!");
		return 0;
	}

	s=p->next;
	*x=s->data;
	p->next=p->next->next;
	free(s);
	return 1;
}

int ListGet(SLNode *head,int i,DataType *x)//输出数据函数
{
	SLNode *p;
	int j;

	p=head;
	j=-1;
	while(p->next !=NULL &&j <i)
	{
		p=p->next;
		j++;
	}

	if(j!=i)
	{
		printf("取元素位置错!");
		return 0;
	}
	*x=p->data;
	return 1;
}

void Destroy(SLNode **head)//销毁内存空间,以免造成内存泄漏
{
	SLNode *p, *p1;

	p=*head;
	while(p!= NULL)
	{
		p1=p;
		p=p->next;
		free(p1);
	}
	*head=NULL;
}

void main()                            //主函数
{
	SLNode  *head;
	int i,x;

	ListInitiate(&head);
	for(i=0;i<10;i++)
		ListInsert(head,i,i+1);
	ListDelete(head,4,&x);
	for(i=0;i<ListLength(head);i++)
	{
		ListGet(head,i,&x);
		printf("%d   ",x);
	}
	Destroy(&head);
	system("pause");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值