线性链表总结

//线性链表总结
#include "stdio.h"
#include <stdlib.h>

typedef struct Link{
	float elem;
	struct Link* next;
} link;

link* createLink(int size)
{
	link* head = (link*)malloc(sizeof(link));	//创建头结点
	link* temp = head;		//定义一个临时节点变量,用于遍历
	for(int i=1; i<size+1; i++){
		link* a = (link*)malloc(sizeof(link));
		a->elem = i*1.0;	//先把内容填上
		a->next = NULL;		//向后连钩子,不知道连谁,先赋值NULL
		temp->next = a;		//向前连钩子
		temp = a;			//更新临时节点
	}
	return head;
}

link* insertElem(link* p, int add, float val)
{
	link* temp = p;
	link* a = (link*)malloc(sizeof(link));

	for(int i=1; i<add; i++){
		if(temp->next == NULL){
			printf("插入位置%d无效\n",add);
			return p;
		}
		temp = temp->next;
	}	
	a->elem = val;
	a->next = temp->next;
	temp->next = a;
	return p;
}

link* delElem(link* p, int add)
{
	link* temp = p;
	if((!p)||(add<1)){
		printf("输入参数无效\n");
		return p;
	}

	//遍历到指定节点的上一个节点
	for(int i=1; i<add; i++){
		if(temp->next == NULL){
			printf("删除位置%d无效\n",add);
			return p;
		}
		temp = temp->next;
	}
	if(temp->next == NULL){
		printf("删除位置%d无效\n",add);
		return p;
	}
	link* delet = temp->next;	//标记要删除的node
	temp->next = temp->next->next;	//更新指针域
	free(delet);
	delet = NULL;
	return p;
}

int selectElem(link* p, float val)
{
	if(!p)
		return -1;
	link* temp = p;
	for(int i=0; temp->next;i++){
		temp = temp->next;
		if(temp->elem == val){
			return i;
		}
	}
	return -1;
}

link* amendElem(link* p, int add, float val)
{
	if(!p)
		return p;
	link* temp = p;
	for(int i=1; i<add; i++){
		if(temp->next == NULL){
			printf("修改位置%d无效\n",add);
			return p;
		}
		temp = temp->next;
	}
	if(temp->next == NULL){
		printf("修改位置%d无效\n",add);
		return p;
	}
	temp->next->elem = val;
	return p;
}

void display(void* prt)
{
	link* temp = ((link*)prt)->next;
	while(temp != NULL){
		printf("%.1f ",temp->elem);
		temp = temp->next;
	}
}

void main()
{
	int add = 0;
	float val = 0.0;
    //初始化链表(1,2,3,4,5)
    printf("初始化链表为:\n");
    link *p=createLink(5);
    display(p);

	add = 2; val = 1.5;
    printf("在第%d号位置插入元素%.1f:\n",add, val);
    p=insertElem(p, add, val);
    display(p);

	add = 4; 
    printf("删除%d号元素:\n",add);
    p=delElem(p, add);
    display(p);
  
	val = 2.2;
    add=selectElem(p, val);
    if (add==-1) {
        printf("没有查到元素值%.1f\n",val);
    }else{
        printf("元素值%.1f的位置为:%d\n",val,add);
    }
	
	add = 7; val = 1.8;
	printf("更改第%d号位置的数据为%.1f:\n",add,val);
    p=amendElem(p, add, val);
    display(p);
	
	system("pause");
	return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值