数据结构:C语言线性链式表(链表)的操作集

数据结构:C语言线性链式表(链表)的操作集

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

#define  ElementType int
#define TEST 222
typedef struct ListNode
{
	ElementType data;
	struct ListNode *next;
}LNode;

int GetLength(LNode *p);                                //操作集1:得到表长
LNode* Findnode_by_index(LNode *p,int index);           //操作集2:得到指定位置的值(位置从1开始) 
LNode* Findnode_by_value(LNode *p,ElementType datax);   //操作集3:得到指定元素的位置 
LNode* Insert(LNode *p,ElementType newdata,int i);      //操作集4:插入
LNode* Delete_by_index(LNode *p,int index);             //操作集5:删除指定位置的元素 
LNode* Delete_by_value(LNode *p,ElementType X);         //操作集5:删除指定元素 
void Showlist(LNode *p);

//操作集1:得到表长
int GetLength(LNode *p)
{
	LNode *temp = p;
	int length=0;
	while (temp)
	{
		temp = temp->next;
		length++;
	}	
	return length;
} 

//操作集2:得到指定位置的元素(位置从1开始)
LNode* Findnode_by_index(LNode *p,int index)
{
	LNode *temp = p;
	int i=1;
	while(i<index&&temp!=NULL)
	{
		temp=temp->next;
		i++;
	}
	if(i==index) return temp;
	else {
		printf("您输入的索引有误");
		return NULL;
	}
}

//操作集3:得到指定元素的位置
LNode* Findnode_by_value(LNode *p,ElementType datax)
{
	LNode *temp = p;
	while(temp!=NULL)
	{
		if (datax == temp->data) return temp;
		else temp=temp->next;
	}
	return NULL;
}

//操作集4:插入
LNode* Insert(LNode *p,ElementType newdata,int i)
{
	LNode *temp,*s;
	if (i==1)
	{
		temp = (LNode*)malloc(sizeof(LNode));
		temp->data=newdata;
		temp->next=p;
		return temp;
	}
	s=Findnode_by_index(p,i-1);
	if (s==NULL){
		printf("索引错误,无法插入元素");
		return p;
	}
	else{
		temp = (LNode*)malloc(sizeof(LNode));
		temp->data=newdata;
		temp->next=s->next;
		s->next=temp;
		return p;
	}
}

//操作集5:删除指定位置的元素
LNode*  Delete_by_index(LNode *p,int index)
{
	LNode *temp=p;
	int i;
	if(index<1 || index>GetLength(p))
	{
		printf("该链表不存在此位置,删除失败");
		return p;
	}
	//分类讨论,删除位置分为1和非1
	if (index==1) return p->next; 
	else {
		for (i=0;i<index-2;i++) temp=temp->next; //循环index-2次,temp到达index-1处的位置 
		temp->next=temp->next->next;
		return p; 
	}
	
} 

//操作集5:删除指定元素
LNode* Delete_by_value(LNode *p,ElementType X)
{
	//还是分类讨论
	if (p->data==X) return p->next;
	 
	LNode *temp=p;
	int i;
	while(temp)
	{
		if(temp->next->data==X)
		{
			temp->next=temp->next->next;
			return p;
		}
		temp=temp->next;
		
	}
	
	printf("can not find X"); 
	return NULL;
}

void Showlist(LNode *p)
{
	LNode *temp=p;
	while (temp!=NULL)
	{
		printf("%d \n",temp->data);
		temp=temp->next; 
	}
}

int main()
{
	LNode *list=NULL;//初始化一个list,此时这个list啥也没有
	 
	//插入操作测试 
	printf("------------------------插入操作测试------------------------\n");
	int a[10]={1,2,45,46,87,34,54,65,43,55};
	int i;
	for(i=0;i<10;i++)
	{
		list=Insert(list,a[i],1);
	} 
	list=Insert(list,TEST,8);
	Showlist(list);
	
	printf("\n------------------------查找操作测试------------------------\n"); 
	printf("第五个元素为%d \n",Findnode_by_index(list,5)->data) ;
	
	printf("\n------------------------删除操作测试------------------------\n");
	list=Delete_by_index(list,3);
	list=Delete_by_value(list,1); 
	printf("删除后的list为\n");Showlist(list); 
	
	printf("\n------------------------计算长度测试------------------------\n");
	printf("链表长度为 %d ",GetLength(list)); 
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值