单链表概念及代码

一、概念
单链表是一种链式存储的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、代码
1、头文件

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

2、声明

//声明结点
typedef struct Listnode
{
	int data;
	Listnode*next;
};
//声明链表
typedef struct List
{
	Listnode head;
	int size;
};

3、函数代码

//初始化
 List* initlist()
{
	List* list=(List*)malloc(sizeof(List)) ;//链表
	list->head.next=NULL;
	list->size=0;
	return list;
}
//插入操作
void Zinsert(List* list,int pos,int data)
{
	//判断
	if(pos<0||pos>list->size)
	{
		pos=list->size;   //优化处理
	}
	if(list==NULL||data==NULL)
	{
		return;
	}
	//新建结点
	Listnode*newnode=(Listnode*)malloc(sizeof(Listnode));
	newnode->data=data;
	newnode->next=NULL;
	Listnode*pcur=&(list->head);
	//插入新结点
	for(int i=0;i<pos;i++)    //得到pos前一个结点
	{
		pcur=pcur->next;
	}
	newnode->next=pcur->next;
	pcur->next=newnode;
	//长度加一
	list->size++;
}
//删除操作
void valuedelete(List* list,int data)
{
	//判断
	if(list==NULL||data==NULL)
	{
		return;
	}
	//删除
	Listnode* pcur=&(list->head);
	Listnode* flag=pcur->next;
	while(pcur!=NULL)
	{
		if(flag->data==data)
		{
			pcur->next=flag->next;
		}
		pcur=pcur->next;
		flag=flag->next;
	}
	list->size--;
}
//单链表的排序  从大到小
void listSort(List* list)
{
	//判断
	if(list==NULL)
	{
		return;
	}
	//冒泡排序
	Listnode* pcur1;
	Listnode* pcur2;
	for(pcur1=list->head.next;pcur1!=NULL;pcur1=pcur1->next)
	{
		for(pcur2=list->head.next;pcur2!=NULL;pcur2=pcur2->next)
		{
			if(pcur1->data > pcur2->data)
			{
				int temp;
				temp=pcur1->data;
				pcur1->data=pcur2->data;
				pcur2->data=temp;
			}
		}
	}
}
//单链表逆置
void back(List* list)
{
	//判断
	if(list==NULL)
	{
		return;
	}
	//逆置
	Listnode* pcur1=list->head.next;
	Listnode* pcur2=NULL;
	while(pcur1!=NULL)
	{
		Listnode* temp;
		temp=pcur1;
		pcur1=pcur1->next;
		temp->next=pcur2;
		pcur2=temp;
		list->head.next=pcur2;
	}
}
//打印
void myprint(List* list)	
{
	if(list==NULL)
	{
		return;
	}
	Listnode*pcur=list->head.next;
	while(pcur!=NULL)
	{
		printf("%d",pcur->data);
		pcur=pcur->next;
	}
	
}
//释放链表内存
void freespace(List* list)
{
	if(list==NULL)
	{
		return;
	}
	free(list);
}

4、主函数

int main()
{
		List*list=initlist();
	//插入
	Zinsert(list,10,1);
	Zinsert(list,10,2);
	Zinsert(list,10,3);
	//打印
	myprint(list);
	//换行
	printf("\n");
	//逆置
	back(list);
	myprint(list);
	printf("\n");
	//删除
	valuedelete(list,2);
	//打印
	myprint(list);
	//释放内存
	free(list);
}

四、运行结果
在这里插入图片描述

发布了13 篇原创文章 · 获赞 3 · 访问量 625

猜你喜欢

转载自blog.csdn.net/weixin_43873172/article/details/104147629
今日推荐