单链表对元素的基本操作

单链表对元素的插入 删除 和查找

在这里插入代码片
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/************************类型定义************************/
typedef char datatype;

void printElem(datatype x) {
	printf("%c",x);
}

typedef struct node {
	datatype data;
	struct node *next;
} LNode,*LinkList;

/**********************单链表的基本操作*********************/
//创建空的单链表 (带头结点)
LinkList Create_Linklist() {
	LinkList L = (LinkList)malloc(sizeof(LinkList));
	L->next=NULL;
	return L;
}

//销毁单链表
void Destroy_Linklist(LinkList *H) {
	LinkList p,temp;
	p =(*H)->next;
	while(p) {
		temp = p;
		p = p->next;
		free(temp);
		//	(*H)=NULL;
	}
	(*H)->next = NULL;
	printf("链表已销毁\n");
}

//求表长
int Length_LinkList(LinkList H) {
	LinkList p = H;
	int j = 1;
	while(p->next) {
		p = p->next;
		j++;
	}
	return j;
}

//按序号查找
LinkList Get_LinkList(LinkList H,int i) {
	if(i>Length_LinkList(H)||i<1)
		return NULL;
	else {
		LinkList p = H;
		i--;
		while(i--) {
			p = p->next;
		}
		return p;
	}
}

//按值查找
LinkList Get_LinkList(LinkList H,datatype x) {
	LNode *p = H->next;
	int fl = 1;
	while(p!=NULL && p->data!=x) {
		p = p->next;
		fl++;
	}
	p = Get_LinkList(H,fl);
	return p;
}

//插入
int Insert_LinkList(LinkList H,int i,datatype x) {
	LinkList p=(LinkList)malloc(sizeof(LinkList));
	p->data=x;
	if(i == Length_LinkList(H)+1) {
		H->next=p;
		p->next=NULL;
	} else {
		p->next = H->next;
		H->next =p;
	}
}

//删除(按序号)
int Delete_LinkList(LinkList H,int i) {
	LNode *p = Get_LinkList(H,i);
	if(p == NULL) {
		return -1;
	} else {
		printf("已找到该序列您确定删除吗?\ny,确定删除\tn,再想想\n");
		char n;
		getchar();
		scanf("%c",&n);
		if(n=='y') {
			LinkList s = p->next;
			p->next=s->next;
			free(s);
			return 1;
		}
	}
}

//删除(按值)
int Delete_LinkList(LinkList H,datatype x) {
	LNode *p = Get_LinkList(H,x);
	if(p == NULL) {
		return -1;
	} else {
		printf("已找到该序列您确定删除吗?\ny,确定删除\tn,再想想\n");
		char n;
		getchar();
		scanf("%c",&n);
		if(n=='y') {
			LinkList s = p->next;
			p->next=s->next;
			free(s);
			return 1;
		} else {
			return -1;
		}
	}
}

/*******************程序的功能函数**************************/
//打印单链表(带头结点)
void Print(LinkList H) {
	printf("head:");
	LinkList p=H->next;
	int flag = 0;
	while(p) {
		printf("-->");
		printElem(p->data);
		p = p->next;
		flag++;
		if(flag>100) {
			printf("程序出错了");
			break;
		}
	}
	printf("\n");
}

//查找(按值或按序号查找,用户可选择任意一种方式)
void Search(LinkList H) {
	printf("请选择查找方式\n1,按序号查找\t2,按值查找\n");
	int n,m;
	scanf("%d",&n);
	getchar();
	if(n==1) {
		printf("请输入要查找的序号\n");
		scanf("%d",&m);
		LinkList q = Get_LinkList(H,m+1);
		if(q==NULL) {
			printf("请输入有效序号");
		} else {
			printElem(q->data);
		}
	} else if(n==2) {
		printf("请输入要查找的值\n");
		datatype s;
		scanf("%c",&s);
		LNode *p = H->next;
		int fl = 1;
		while(p!=NULL && p->data!=s) {
			p = p->next;
			fl++;
		}
		if(p==NULL)
			printf("该元素不存在");
		else {
			printf("该元素位置为\n");
			printf("%d\n",fl);
		}

	}
}

//插入
void Insert(LinkList H) {
	datatype x;
	int n;
	printf("已有%d个输入插入位置和数据:",Length_LinkList(H)-1);
	scanf("%d",&n);
	getchar();
	LinkList p = Get_LinkList(H,n);
	scanf("%c",&x);
	if(p==NULL)
		printf("参数i错\n");
	else {
		Insert_LinkList(p,n,x);
		printf("插入成功\n");
	}
}

//删除 (按值或按序号删除,用户可选择任意一种方式)
void Delete(LinkList H) {
	printf("请选择删除方式\n1,按序号删除\t2,按值删除\n");
	int t,m,n,ret;
	datatype x;
	scanf("%d",&t);
	if(t == 1) {
		printf("请输入要删除的序号\n");
		scanf("%d",&m);
		ret = Delete_LinkList(H,m);
	} else if(t == 2) {
		printf("请输入要删除的值\n");
		getchar();
		scanf("%c",&x);
		ret = Delete_LinkList(H,x);
	}
	if(ret == 1)
		printf("删除成功");
	else if(ret == -1)
		printf("删除失败请输入有效序号");
}

/*******************main函数**************************/
void printChoice() {
	printf("\n请选择功能:\n");
	printf("\t1.打印\n");
	printf("\t2.查找\n");
	printf("\t3.插入\n");
	printf("\t4.删除\n");
	printf("\t5.退出程序\n");
	printf("请选择:");
}

int main() {
	int n;
	LinkList p = Create_Linklist();
	while(1) {
		printChoice();
		scanf("%d",&n);
		if(n == 5) {
			Destroy_Linklist(&p);
			break;
		}
		switch(n) {
			case 1:
				Print(p);
				break;
			case 2:
				Search(p);
				break;
			case 3:
				Insert(p);
				break;
			case 4:
				Delete(p);
				break;
		}
	}

}



删除线格式

  1. List item
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值