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

原创
2019/09/11 19:16
阅读数 354

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

#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");
}

运行结果:

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

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

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

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

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

个人网站:www.yangmufa.com    ,

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

Gitee:https://gitee.com/yangmufa    ,

GitHub:https://github.com/yangmufa    。

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部