單鏈表概念及代碼

一、概念
單鏈表是一種鏈式存儲的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) +指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
二、代碼
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);
}

四、運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章