数据结构 ---- 单链表

这篇博客介绍了如何使用C语言实现单链表数据结构,包括初始化链表、输出链表内容、在链表尾部添加元素、在指定位置插入元素以及删除元素等操作。通过实例代码详细解析了每个操作的过程,帮助读者深入理解单链表的使用,并提供了测试用例展示这些操作的效果。
摘要由CSDN通过智能技术生成

经过第二节课的学习,我学到了一个新的对于数据进行存储以及使用的方式-----单链表。它让我重新认识到了C语言中的数据结构,以后我对于C语言数据的使用,不再是以单一的数组、线性表来使用,而是可以用到单链表去对数据进行增加、插入、删除等一系列操作。同时,经过描摹老师的代码,我也感触深刻,对单链表这部分的内容理解的更加深入,有助于我后续在实际应用中更好的操作和管理数据,也开阔了我的知识面。话不多说,以下是描摹老师的代码,以及我对与单链表进行实体化的示意图。

基础函数

定义结构体

typedef struct LinkNode
{
	char data;
	struct LinkNode *next;
}LNode,*LinkList,*NodePtr;

初始化链表结构

/*初始化链表*/ 
LinkList initLinkList()
{
	/*给这个链表一个头节点,以方便去访问*/
	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
	/*初始化这个头节点*/ 
	tempHeader->data = '\0';
	tempHeader->next = NULL;
	/*返回这个头节点,以方便后续对链表进行操作*/
	return tempHeader; 
}

输出链表内容

/*输出链表中的数据*/
void printList(NodePtr paraHeader)
{
	/*定义一个指针指向头结点的下一个位置*/ 
	NodePtr p = paraHeader->next;
	/*利用循环结构进行输出*/
	while (p != NULL)
	{
		printf("%c",p->data);
		p = p->next;	
	}
	printf("\r\n"); 
}

操作链表数据

添加链表中的元素(尾部)

void appendElement(NodePtr paraHeader,char paraChar)
{
	/*定义两个中间变量*/ 
	NodePtr p,q;
	
	/*为q创建一个链表单元,然后将q中的data赋予新加的值*/ 	
	q = (NodePtr)malloc(sizeof(LNode));
	q->data = paraChar;
	q->next = NULL;
	
	/*将头节点的地址赋予p*/
	p = paraHeader;
	/*利用循环到链表的末尾位置*/ 
	while (p->next != NULL)
	{
		p= p->next; 
	}
	
	/*现在开始增加*/ 
	p->next = q;
}

 

在单链表的指定位置插入元素

void insertElement(NodePtr paraHeader,char paraChar, int paraPosition)
{
	NodePtr p,q;
	
	/*找到元素位置*/
	p = paraHeader;
	for(int i = 0;i < paraPosition; i ++)
	{
		p= p->next;
		if(p == NULL)
		{
			printf("错误!!!请重新输入!!\r\n");
			return; 
		}
	} 
	
	/*获得新元素*/
	q = (NodePtr)malloc(sizeof(LNode));
	q->data = paraChar;
	
	/*添加*/
	printf("linking\r\n");
	q->next = p->next;
	p->next = q; 
}

 

删除元素

/*删除链表中的元素*/ 
void deleteElement(NodePtr paraHeader,char paraChar)
{
	NodePtr p,q;
	p = paraHeader;
	/*找到需要的位置*/ 
	while ((p->next != NULL) && (p->next->data != paraChar))
	{
		p = p->next;
	}
	
	if(p->next == NULL)
	{
		printf("找不到该元素!");
		return;
	}
	
	q = p->next;
	p->next = p->next->next;
	free(q);
}

 

进行测试

void appendInsertDeleteTest()
{
	/*初始化单链表*/
	LinkList tempList = initLinkList();
	printList(tempList);
	
	/*添加元素*/
	appendElement(tempList,'L');
	appendElement(tempList,'I');	
	appendElement(tempList,'N');
	appendElement(tempList,'L');
	appendElement(tempList,'I');
	appendElement(tempList,'N');
	appendElement(tempList,'9');
	printList(tempList);
	
	/*删除元素*/ 
	deleteElement(tempList,'L');
	deleteElement(tempList,'I');
	deleteElement(tempList,'N');
	printList(tempList);
	
	/*插入元素*/
	insertElement(tempList,'S',0);
	printList(tempList);
	insertElement(tempList,'H',1);
	printList(tempList);
	insertElement(tempList,'I',2);
	printList(tempList);
	insertElement(tempList,'I',10);
	printList(tempList); 
}

测试结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值