数据结构单向链表操作(全部代码)

Linlist.h:

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

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

typedef  char datatype;

typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};

	struct Node *next;
}Linklist;

//创建
Linklist* listCreat();
//申请节点
Linklist* nodeBuy(datatype e);
//判空
int listEmpty(Linklist *L);
//头插
int listInsertHead(Linklist *L,datatype e);
//遍历
void listShow(Linklist *L);
//尾插
int listInsertTail(Linklist *L,datatype e);
//按位置查找返回找到的节点
Linklist* findNode(Linklist *L,int pos);
//任意位置插入
int listInsertPos(Linklist *L,int pos,datatype e);
//头删
int listDeleteHead(Linklist*L);
//尾删
int listDeleteTail(Linklist*L);
//任意删
int listDeletePos(Linklist *L,int pos);
//按值查找
int listSearchValue(Linklist *L,datatype e);
//按位置修改
int listUpdatePos(Linklist *L,int pos,datatype e);
//按值修改
int listUpdateValue(Linklist *L,datatype old_e,datatype new_e);
//链表反转
void listReverse(Linklist*L);
//销毁链表
void listFree(Linklist *L);

#endif

Linklist.c:

#include "linklist.h"

//创建---------------------------------------------------------------
Linklist *listCreat()
{
	
	Linklist *L	= (Linklist *)malloc(sizeof(Linklist));
	if(NULL == L)
	{
		printf("链表创建失败\n");
		return NULL;
	}
	L->len = 0;
	L->next = NULL;

	printf("链表创建成功\n");
	return L;
}


//申请节点------------------------------------------------------------
Linklist *nodeBuy(datatype e)
{
	Linklist *p =(Linklist *)malloc(sizeof(Linklist));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return NULL;
	}

	p->data = e;
	p->next = NULL;
}


//判空-----------------------------------------------------------------
int listEmpty(Linklist *L)
{
	return L->next == NULL? 1: 0;
}


//头插-----------------------------------------------------------------
int listInsertHead(Linklist *L,datatype e)
{
	//判断条件
	if(NULL == L)
	{
		printf("所给链表不合法\n");
		return -1;
	}

	//申请节点
	Linklist *p = (Linklist *)malloc(sizeof(Linklist));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return -1;
	}

	//数据放入节点
	p->data = e;
	p->next = NULL;

	//完成头插
	p->next = L->next;
	L->next = p;

	//表的变化
	L->len ++;

	printf("头插%c成功\n",e);
}


//遍历-----------------------------------------------------------
void listShow(Linklist *L)
{
	//判断逻辑
	if(NULL == L ||listEmpty(L) )
	{
		printf("遍历失败\n");
		return;
	}

	//遍历逻辑
	printf("链表元素分别是:");
	Linklist *q = L->next;
	while(q != NULL)
	{
		printf("%c\t",q->data);
		q = q->next;
	}
	printf("\n");
}


//尾插---------------------------------------------------------------------------
int listInsertTail(Linklist *L,datatype e)
{
	if(NULL == L)
	{
		printf("所给链表不合法\n");
	}

	Linklist *p =nodeBuy(e);
	Linklist *q = L;
	while(q->next != NULL)
	{
		q = q->next;
	}

	q->next = p;
	L->len++;
	printf("%c尾插完成\n",e);
}


//按位置查找返回找到的节点------------------------------------------------------
Linklist *findNode(Linklist *L,int pos)
{
	if(NULL == L || pos < 0 || pos > L->len)
	{
		printf("查找失败\n");
		return NULL;
	}

	Linklist *q = L;
	for(int i = 1;i <= pos;i++)
	{
		q = q->next;
	}
	return q;
}

//任意位置插入-------------------------------------------------------
int listInsertPos(Linklist *L,int pos,datatype e)
{
	if(NULL == L || pos < 1 || pos > L->len + 1)	
	{
		printf("插入失败\n");
		return -1;
	}

	Linklist *p = nodeBuy(e);
	Linklist *q = findNode(L,pos-1);
	
	p->next = q->next;
	q->next = p;

	L->len++;
	printf("%d位置插入%c成功\n",pos,e);
	return 0;
}

//头删------------------------------------------------------------
int listDeleteHead(Linklist*L)
{
	if(NULL == L || listEmpty(L))
	{
		printf("删除失败\n");
		return -1;
	}

	Linklist *p = L->next;
	L->next = p->next;
	free(p);
	p = NULL;

	L->len--;
	printf("头删成功\n");
	return 0;
}


///尾删--------------------------------------------------------
int listDeleteTail(Linklist*L)
{
	if(NULL == L || listEmpty(L))
	{
		printf("尾删失败\n");
		return -1;
	}
	
	Linklist *p = L;
	Linklist *q = NULL;
	while(p->next != NULL)
	{
		q = p;
		p = p->next;
	}

	q->next=NULL;
	free(p);
	p = NULL;
	L->len--;
	printf("尾删除成功\n");
	return 0;
}

//按位置修改-------------------------------------------------
int listUpdatePos(Linklist *L,int pos,datatype e)
{
	if(NULL == L || pos < 0 || pos > L->len)
	{
		printf("修改失败\n");
	}
	Linklist *p=L;
	for(int i = 0;i < pos;i++)
	{
		p = p->next;
	}

	p->data = e;
	printf("%d位置的成功修改为%c\n",pos,e);

}


//按值修改------------------------------------------------------
int listUpdateValue(Linklist *L,datatype old_e,datatype new_e)
{
	if(NULL == L || listEmpty)
	{
	
	}
	Linklist *p = L->next;
	for(int i = 1;i > L->len;i++)
	{
		if(p->data == old_e)
		{
			p->data = new_e;
		}
		p = p->next;
	}
	printf("修改成功\n");
}



//任意删------------------------------------------------------------
int listDeletePos(Linklist *L,int pos)
{
	if(NULL == L ||listEmpty(L)|| pos < 1 || pos > L->len )	
	{
		printf("删除失败\n");
		return -1;
	}
	
	Linklist* q = findNode(L,pos-1);
	Linklist* p = q->next;
	q->next = p->next;
	free(p);
	p = NULL;

	L->len--;
	printf("%d位置删除成功\n",pos);
}



//按值查找----------------------------------------------------------
int listSearchValue(Linklist *L,datatype e)
{
	if(NULL == L || listEmpty(L))
	{
		printf("查找失败\n");
		return -1;
	}

	Linklist *q = L->next;
	for(int i = 1;i < L->len;i++)
	{
		if(q->data == e)
		{
			return i;
		}
		q = q->next;
	}

	return 0;
}


//销毁链表-------------------------------------------------------------
void listFree(Linklist *L)
{
	if(NULL == L)
	{
		return;
	}

	while(L->next != NULL)
	{
		listDeleteHead(L);
	}

	free(L);
	L = NULL;

	printf("销毁链表成功\n");
	return;
}

//链表反转-------------------------------------------------------------
void listReverse(Linklist*L)
{
	if(NULL == L || listEmpty(L))
	{
		printf("反转失败\n");
		return;
	}

	Linklist *p1 = L->next;
    Linklist *p2 = L->next->next;
    Linklist *p3 = NULL;

    while(p2 != NULL)
	{
    	p3 = p2->next;
        p2->next = p1;

        p1 = p2;
        p2 = p3;
    }
    L->next->next = NULL;
    L->next = p1;
}

main.c:

#include "linklist.h"

int main(int argc, const char *argv[])
{
	//调用创建函数
	printf("------------创建函数---------------\n");
	Linklist *L = listCreat();
	if(NULL == L)
	{
		return -1;
	}

	//调用头插函数
	printf("------------头插函数---------------\n");
	listInsertHead(L,'Q');
	listInsertHead(L,'W');
	listInsertHead(L,'E');
	listInsertHead(L,'R');
	listInsertHead(L,'T');
	listInsertHead(L,'Y');
	listInsertHead(L,'U');
	listInsertHead(L,'I');

	listShow(L);

	//调用遍历函数
	printf("------------遍历函数---------------\n");
	listShow(L);

	//调用尾插函数
	printf("------------尾插函数---------------\n");
	listInsertTail(L,'K');
	listShow(L);

	//按位置查找返回找到的节点
	printf("------------查找函数---------------\n");
	findNode(L,3);

	//任意位置插入
	printf("------------插入函数---------------\n");
	listInsertPos(L,6,'E');
	listShow(L);
		
	//头删
	printf("------------头删函数---------------\n");
	listDeleteHead(L);
	listShow(L);

	//尾删
	printf("------------尾删函数---------------\n");
	listDeleteTail(L);
	listShow(L);

	//任意删
	printf("------------删除函数---------------\n");
	listDeletePos(L,3);
	listShow(L);

	//按值查找
	printf("------------按值查找---------------\n");
	int res = listSearchValue(L,'W');
	if(res == -1)
	{
		printf("查找失败\n");
	}else if (res == 0)
	{
		printf("没找到\n");
	}else if(res > 0)
	{
		printf("查找成功,在%d个位置\n",res);
	}

	//按位置修改
	printf("-----------按位置修改--------------\n");
	listUpdatePos(L,3,'W');
	listShow(L);

	//按值修改
	printf("------------按值修改---------------\n");
	listUpdateValue(L,'W','A');
	listShow(L);

	//反转链表
	printf("------------反转链表---------------\n");
	listReverse(L);
	listShow(L);

	//销毁链表
	printf("------------销毁链表---------------\n");
	listFree(L);
	L = NULL;
	listShow(L);	

	return 0;
}

测试展示:

------------创建函数---------------
链表创建成功
------------头插函数---------------
头插Q成功
头插W成功
头插E成功
头插R成功
头插T成功
头插Y成功
头插U成功
头插I成功
链表元素分别是:I	U	Y	T	R	E	W	Q	
------------遍历函数---------------
链表元素分别是:I	U	Y	T	R	E	W	Q	
------------尾插函数---------------
K尾插完成
链表元素分别是:I	U	Y	T	R	E	W	Q	K	
------------查找函数---------------
------------插入函数---------------
6位置插入E成功
链表元素分别是:I	U	Y	T	R	E	E	W	Q	K	
------------头删函数---------------
头删成功
链表元素分别是:U	Y	T	R	E	E	W	Q	K	
------------尾删函数---------------
尾删除成功
链表元素分别是:U	Y	T	R	E	E	W	Q	
------------删除函数---------------
3位置删除成功
链表元素分别是:U	Y	R	E	E	W	Q	
------------按值查找---------------
查找成功,在6个位置
-----------按位置修改--------------
3位置的成功修改为W
链表元素分别是:U	Y	W	E	E	W	Q	
------------按值修改---------------
修改成功
链表元素分别是:U	Y	W	E	E	W	Q	
------------反转链表---------------
链表元素分别是:Q	W	E	E	W	Y	U	
------------销毁链表---------------
头删成功
头删成功
头删成功
头删成功
头删成功
头删成功
头删成功
销毁链表成功
遍历失败

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值