链表常用函数总结

//创建单链表  
PNODE creat_list()
{
	int len;
	int i;
	int val;
	PNODE pHead=NULL;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
	{
		printf("分配内存失败,请重新输入"); 
	}
	PNODE pTail=pHead;
	pTail->Next=NULL;
	printf("请您输入需要链表的的个数%d",len); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		printf("请您输入链表的%d个节点的值",i+1);
		scanf("%d",&val);
		PNODE pNew=(PNODE)malloc(sizeof(NODE));
		pNew->data=val;
		pTail->Next=pNew;
		pNew->Next=NULL;
		pTail=pNew;
	}
	return pHead;
}
//遍历输出 
void traverse_list(PNODE pHead)
{
   PNODE p=NULL;
   p=pHead->Next;
   while(p)
    {
	    printf("%d ",p->data);
    	p=p->Next;
    }	
    printf("\n");
    return;
}
//判断是否为空 
bool empty_list(PNODE pHead)
{
	if(NULL==pHead->Next)
	return true;
	else
	return false;
}
//求链表长度 
int length_list(PNODE pHead)
{
	
	PNODE p=pHead->Next;
	int len=0;
	while(NULL!=p)
	{
		++len;
		p=p->Next;
	}
	return len;
}
//排序 
void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->Next;i<len-1;i++,p=p->Next)
	{ 
		for(j=i+1,q=p->Next;j<len;j++,q=q->Next)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j] 
			{
				t=p->data;//类似于数组中的:a[i]>a[j] 
				p->data=q->data;//a[i]=a[j]
				q->data=t;//a[j]=t
			}
		}
	}
return;
}
//在pHead所指向链表的第pos个节点的前面插入一个新节点,该节点的值是val,并且pos的值是从1开始 
bool insert_list(PNODE pHead,int pos,int val )
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p)
	return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(NULL==pNew)
	{
		printf("动态内存分配失败!\n");
	    exit(-1);
	}
	pNew->data=val;
	PNODE q=p->Next;
	p->Next=pNew;
	pNew->Next=q;
	return true;
}
//删除某个节点的值 
bool delete_list(PNODE pHead,int pos,int *pVal)
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p->Next&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p->Next)
	return false;
	PNODE q=p->Next; 
	//存放被删除的那个 
	*pVal=q->data;
	//删除p节点后面的节点 
	p->Next=p->Next->Next;
	free(q);
	q=NULL;
	return true;
}

 完整代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct st{
	int data;
	struct st*Next;
}NODE,*PNODE; 
PNODE creat_list();
void traverse_list(PNODE pHead);
bool empty_list(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead);
bool insert_list(PNODE pHead,int pos,int val );
bool delete_list(PNODE pHead,int pos,int *pVal); 
int main(void)
{
	PNODE pHead=NULL;
	int val;
	pHead=creat_list();
	traverse_list(pHead);
    if(delete_list(pHead,4,&val)){
    	printf("删除成功,您删除的元素是:%d\n",val);
	}
	else
	{
		printf("删除失败!您删除的元素不存在\n");
	}
	//insert_list(pHead,4,33);
	traverse_list(pHead);
	//int len=length_list(pHead);
	//printf("链表长度为%d\n",len);
	//sort_list(pHead);
	//traverse_list(pHead);
	/*if(empty_list(pHead))
	  printf("链表为空");
	else
	  printf("链表不空"); */
}
//创建单链表  
PNODE creat_list()
{
	int len;
	int i;
	int val;
	PNODE pHead=NULL;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
	{
		printf("分配内存失败,请重新输入"); 
	}
	PNODE pTail=pHead;
	pTail->Next=NULL;
	printf("请您输入需要链表的的个数%d",len); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		printf("请您输入链表的%d个节点的值",i+1);
		scanf("%d",&val);
		PNODE pNew=(PNODE)malloc(sizeof(NODE));
		pNew->data=val;
		pTail->Next=pNew;
		pNew->Next=NULL;
		pTail=pNew;
	}
	return pHead;
}
//遍历输出 
void traverse_list(PNODE pHead)
{
   PNODE p=NULL;
   p=pHead->Next;
   while(p)
    {
	    printf("%d ",p->data);
    	p=p->Next;
    }	
    printf("\n");
    return;
}
//判断是否为空 
bool empty_list(PNODE pHead)
{
	if(NULL==pHead->Next)
	return true;
	else
	return false;
}
//求链表长度 
int length_list(PNODE pHead)
{
	
	PNODE p=pHead->Next;
	int len=0;
	while(NULL!=p)
	{
		++len;
		p=p->Next;
	}
	return len;
}
/*狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作一样的 
*/ 
//排序 
void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->Next;i<len-1;i++,p=p->Next)
	{ 
		for(j=i+1,q=p->Next;j<len;j++,q=q->Next)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j] 
			{
				t=p->data;//类似于数组中的:a[i]>a[j] 
				p->data=q->data;//a[i]=a[j]
				q->data=t;//a[j]=t
			}
		}
	}
return;
}
//在pHead所指向链表的第pos个节点的前面插入一个新节点,该节点的值是val,并且pos的值是从1开始 
bool insert_list(PNODE pHead,int pos,int val )
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p)
	return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(NULL==pNew)
	{
		printf("动态内存分配失败!\n");
	    exit(-1);
	}
	pNew->data=val;
	PNODE q=p->Next;
	p->Next=pNew;
	pNew->Next=q;
	return true;
}
//删除某个节点的值 
bool delete_list(PNODE pHead,int pos,int *pVal)
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p->Next&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p->Next)
	return false;
	PNODE q=p->Next; 
	//存放被删除的那个 
	*pVal=q->data;
	//删除p节点后面的节点 
	p->Next=p->Next->Next;
	free(q);
	q=NULL;
	return true;
}

 

 

 

 /狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作一样的

题外话:你们的支持是我不懈的动力,还请大家多多支持
 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言中,链表函数的实参“equal”通常是一个函数指针,用于比较链表中的节点值是否相等。 例如,以下是一个简单的链表结构体: ```c typedef struct node { int data; struct node *next; } Node; ``` 如果我们要在链表中查找特定的值,可以使用以下函数: ```c Node* find(Node *head, int value, int (*equal)(int, int)) { Node *p = head; while (p != NULL) { if (equal(p->data, value)) { return p; } p = p->next; } return NULL; } ``` 这个函数接受三个参数:链表头节点指针、要查找的值、以及一个函数指针equal。函数指针equal指向一个比较函数,该函数接受两个int类型的参数,分别表示链表节点的值和要查找的值,返回一个int类型的值表示比较结果。如果equal返回0,则表示两个值不相等;否则表示相等。 例如,我们可以定义一个比较函数,比较两个int类型的值是否相等: ```c int compare(int a, int b) { return a == b; } ``` 然后我们可以调用find函数,在链表中查找特定的值: ```c Node *head = NULL; // 创建链表... Node *p = find(head, 42, compare); if (p != NULL) { printf("找到了节点,值为%d\n", p->data); } else { printf("没找到节点\n"); } ``` 在上面的代码中,我们通过调用find函数,在链表中查找值为42的节点。函数指针equal指向了compare函数,表示比较两个int类型的值是否相等。如果找到了节点,则输出节点的值;否则输出“没找到节点”。 ### 回答2: 在C语言中,链表是一种常用数据结构,通过链接每个节点形成的数据集合。链表的每个节点包含两个属性:数据和指向下一个节点的指针。 实现链表相关函数时,我们经常需要比较节点的数据。而equal函数就是用来判断两个节点的数据是否相等的。 equal函数的实参通常需要传入要比较的两个节点,然后返回一个布尔值表明它们数据是否相等。 在实现equal函数时,我们可以按照以下步骤进行: 1. 首先,我们需要定义一个自定义的结构体表示链表节点,结构体内部可以包含存储数据的成员和指向下一个节点的指针成员。 2. 接下来,我们可以定义equal函数函数的声明可能类似于`bool equal(Node* node1, Node* node2)`,其中`Node*`表示节点指针类型,`bool`表示返回值类型。 3. 在函数内部,我们可以通过访问节点指针中的数据成员来进行比较。比较的方式可以根据具体的需求来确定,比如可以使用"=="来判断两个节点的数据是否相等。 4. 最后,根据比较结果,我们可以返回一个布尔值。一般地,如果两个节点的数据相等,我们可以返回`true`;否则,返回`false`表示它们的数据不相等。 总结: 在链表相关函数实现中,equal函数用于比较两个节点的数据是否相等。我们可以通过比较节点的数据来确定返回值,以便于其他函数链表操作过程中使用。 ### 回答3: 在C语言链表函数中,如果我们想要判断两个链表是否相等,可以使用equal函数作为实参。 equal函数的功能是判断两个链表是否拥有相同的数据和结构。 在equal函数的编写过程中,我们可以使用循环逐个比较两个链表中的节点数据。首先,我们需要判断两个链表的节点数目是否相等,如果不相等则两个链表必定不相等。接下来,我们可以使用一个循环来迭代比较两个链表中对应位置的节点数据。如果在某一位置上两个节点的数据不相等,则可以判定链表不相等。如果循环结束后所有节点都相等,则可以判定链表相等。 实现equal函数时,可以将两个链表的头节点作为实参传递进来。函数的返回值可以设置为布尔类型,用于表示链表是否相等。在比较节点数据时,可以使用逻辑运算符进行判断,例如使用"=="来判断节点数据是否相等。 在函数代码编写完毕后,可以通过调用equal函数来比较两个链表是否相等。如果返回值为true,则表示两个链表相等;如果返回值为false,则表示两个链表不相等。 总之,equal函数作为实参用于判断两个链表是否相等,可以通过比较节点数据和结构来确定链表是否相等。函数的实现通常需要遍历链表,并使用逻辑运算符来进行比较判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值