C语言-单链表的初始化、插入与删除

抽象数据元素、顺序表、节点、头节点的定义:

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

//抽象数据元素
typedef struct{
	int id;
	char *nmae;
}dataElement;

//顺序表
typedef struct{
	dataElement DataArray[255];
	int length;
}SequenceList;

//节点
typedef struct Node{
	dataElement Data;//数据域
	struct Node *Next;//指针域
}Node;

//头节点
typedef struct {
	int length;//链表长度
	Node *Next;//头指针
}LinkList;

单链表的初始化、插入与删除、清空等:

#include "DataElement.h"

void InsertElement(LinkList * linkList,int pos,dataElement element);
dataElement DeletListElement(LinkList * linkList,int pos,dataElement element);
void CleartList(LinkList * linkList);
void DestroyList(LinkList * linkList);
void Prints(LinkList *linkList);
void Print(LinkList *linkList,int pos);
dataElement GetLinkElement(LinkList *linkList,int pos);



//初始化链表
void InitList(LinkList * linkList,dataElement *dataArray,int length){
	int i=0;
	for(i;i<length;i++){
		InsertElement(linkList,i+1,dataArray[i]);
	}
	if(linkList->length){
		printf("初始化成功!(长度:%d)\n",linkList->length);
	}
}

//插入表节点
void InsertElement(LinkList * linkList,int pos,dataElement element){
	Node *currentNode=linkList->Next;
	int i=1;

	//1、创建节点并分配内存空间
	Node *node=(Node*)malloc(sizeof(Node));
	node->Data=element;
	node->Next=NULL;
	//2、找到要插入的当前位置
	if(pos==1){//如果插入的位置为一则直接插入
		linkList->Next=node;
		linkList->length++;
		return;
	}
	for(i;currentNode&&i<pos-1;i++){
		currentNode=currentNode->Next;//循环找到pos当前的元素位置
	}
	//3、将节点插入并对接节点前后的位置
	if(currentNode){
		node->Next=currentNode->Next;//把当前节点的前驱设置为新节点
		currentNode->Next=node;//把新前节点的前驱设置为当前节点的前驱
		linkList->length++;//链表的总长度加一
	}
}

//删除表节点
dataElement DeletListElement(LinkList * linkList,int pos){
	int i=1;
	dataElement element;//被删除的元素
	Node * node;//当前节点
	Node * frontNode;//前置节点
	if(pos==1){
		node=linkList->Next;//把要删除的节点暂时赋给node
		if(node){
			element=node->Data;//记录被删除的数据
			linkList->Next=node->Next;//把被删除的元素的next赋给头指针的next。
			free(node);//释放被删除的节点
			linkList->length--;//删除后表总长度减一。
			return element;
		}
	}
	node=linkList->Next;//设定node为第一个元素地址
	for(i;node&&i<pos;i++){
		frontNode=node;//记录当前节点
		node=node->Next;//记录被删除节点的后置节点
	}
	if(node){
		element=node->Data;//记录被删除的数据以便返回
		frontNode->Next=node->Next;//把被删除的节点的next非给其前置节点的next;
		free(node);//释放被删除的节点
		linkList->length--;//表总长度减一;
	}
	return element;
}

//清空链表
void CleartList(LinkList * linkList){
	Node *node=linkList->Next;//
	Node *nextNode;//当前节点的后置节点
	while(node){
		nextNode=node->Next;//记录当前节点的下一节点
		free(node);//释放当前节点
		node=nextNode;//循环更新当前节点为前一节点的后置节点。
	}
	linkList->length=0;//表总长度置零
	linkList->Next=NULL;//头指针置空
}

//销毁整个表
void DestroyList(LinkList * linkList){}

//输出打印所有节点的元素信息
void Prints(LinkList *linkList){
	int i=0;
	Node *node=linkList->Next;
	if(linkList->length&&linkList->Next){
		for(i;i<linkList->length;i++){
			printf("%d : %s\n",node->Data.id,node->Data.nmae);
			node=node->Next;
		}
	}else{printf("\n表为空!输出失败!!!\n");}

}

//打印输出指定位置节点的信息
void Print(LinkList *linkList,int pos){
	int i=1;
	Node *node=linkList->Next;
	for(i;i<linkList->length-1;i++){	
		node=node->Next;
	}
	printf("%d : %s\n",node->Data.id,node->Data.nmae);
}

//获取链表的某个元素
dataElement GetLinkElement(LinkList *linkList,int pos){
	int i=1;
	Node *node = linkList->Next;
	for(i;node&&i<pos;i++){
		node=node->Next;
	}
	return node->Data;
}

测试:

#include "LinkListOperation.h"

int main(){

	dataElement dataArray[]={
		{11,"yang"},
		{22,"yangmufa"}
	};

	LinkList *linkList;
	/***/
	dataElement element;//创建新元素用来插入
	element.id=222;
	element.nmae=(char*)malloc(10);//开内存
	element.nmae="整条街最靓的仔";
	//strcpy(element.nmae,"整条街最靓的仔");

	linkList=(LinkList*)malloc(sizeof(LinkList));
	linkList->length=0;//初始化之前链表长度置零
	InitList(linkList,dataArray,sizeof(dataArray)
		/sizeof(dataArray[0]));//执行初始函数

	printf("\n初始化后:\n");
	Prints(linkList);//输出打印整个链表信息

	InsertElement(linkList,2,element);//执行插入函数,在下标2处插入element数据元素;

	printf("\n插入新节点后:\n");
	Prints(linkList);

	element=DeletListElement(linkList,1);//执行删除函数删除下标为2元素
	printf("\n删除的节点:id :%d --- name :%s \n",element.id,element.nmae);

	printf("\n输出单个指定位置的元素信息:");
	Print(linkList,2);//执行输出某单个节点的信息函数

	CleartList(linkList);//执行清空链表函数

	Prints(linkList);//输出打印整个链表信息

printf("\n");
}

运行结果:

7d7b7a6126e773610757f9f41db2054a6c9.jpg

/* ------------------- 反爬声明o(*▽*)咻咻咻 --------------------

作者: 杨木发
版权声明:
本文为博主倾情原创文章,整篇转载请附上源文链接!

如果觉得本文对你有所收获,你的请评论点赞 与

合理优质的转发也将是鼓励支持我继续创作的动力,

更多精彩可百度搜索 杨木发 或:

个人网站: www.yangmufa.com

开源中国: https://my.oschina.net/yangmufa

Gitee: https://gitee.com/yangmufa

GitHub: https://github.com/yangmufa

坚持创作 善于总结 开源共享 高质进步。
------------------- 反爬声明o(*▽*)咻咻咻 -------------------- */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程练习生2

你的鼓励将是我创作的最大动力o

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值