单链表(无头结点)的一些操作

//单链表(不带头结点)的一些基本操作
#include<stdio.h>
#include<stdlib.h>
//创建单链表 
typedef struct listnode{
	int data;                        //数据域 
	struct listnode* next;           //指针域 
}listNode,* linkList;
//初始化
void initialist(linkList &L){
	L = NULL;
	printf("初始化完毕!\n");
}
//判断初始化是否成功 
bool judge(linkList &L){
	if(L == NULL){
		printf("初始化成功!\n");
		return true;
	}
	else{
		printf("初始化失败!\n");
		return false;
	}
}
//长度
int getLength(linkList &L){
	int len;
	listNode* N;
	N = L;
	len = 0;
	while(N != NULL){
		len++;
		N = N->next;
	}
	return len;
} 
//输出
void printlist(linkList &L){
	int i;
	listNode* N;
	N = L;
	while(N != NULL){
		if(N->next == NULL){
			printf("%d\n",N->data);
		}
		else{
			printf("%d ",N->data);
		}
		N = N->next;
	}
	printf("单链表内容输出完毕!\n");
	printf("其长度是%d\n",getLength(L));
}
//创建链表(头插法)
void setlinkList(linkList &L){
	int ele;
	listNode* N;
	printf("请输入你想要的元素大小(除-1外):\n");
	scanf("%d",&ele);
	while(ele != -1){
		N = (listNode*)malloc(sizeof(listNode));
		N->data = ele;
		N->next = L;
		L = N;
		printf("%d已进入此链表中!\n",ele);
		printf("结束创建请输入-1\n");
		scanf("%d",&ele); 
	}
	printf("单链表建立完毕!(头插法)\n");
	printlist(L);
	
} 
//创建链表(尾插法)
void setListrear(linkList &L){
	int ele,i;
	listNode* N;
	listNode* P;
	i = 0;
	printf("请输入你要的元素大小(除数字-1外):\n");
	scanf("%d",&ele);
	while(ele != -1){
		N = (listNode*)malloc(sizeof(listNode));
		N->data = ele;
		if(i == 0){
			L = N;
			L->next = NULL;
			P = L;
			i = 1;
		}
		else{
			P->next = N;
			P = N; 
		}
		printf("%d成功进入链表中!\n",ele);
		printf("结束创建请输入-1\n");
		scanf("%d",&ele); 
	}
	N->next = NULL;
	printf("单链表建立完毕!(尾插法)\n");
	printlist(L);
} 
//增
void add(linkList &L){
	int ele,local,i;
	listNode* N;
	listNode* P;
	i = 1;
	printf("请输入你想要插入的元素大小以及位置:\n");
	scanf("%d %d",&ele,&local);
	while((local < 1)||(local > getLength(L))){
		printf("输入的位置不合法,请重新输入!\n");
		scanf("%d",&local);
	}
	if(local == 1){
		N = (listNode*)malloc(sizeof(listNode));
		N->data = ele;
		N->next = L;
		L = N;
	}
	else{
		P = L;
		while(i+1 < local){
			i++;
			P = P->next;
		}
		N = (listNode*)malloc(sizeof(listNode));
		N->data = ele;
		N->next = P->next;
		P->next = N;
	}
	printf("成功插入该元素!\n");
	printlist(L);
}
//删 
int delelem(linkList &L){
	int local,i,ele;
	listNode* N;
	listNode* P;
	i = 1;
	printf("请输入你要删除的元素位置:\n");
	scanf("%d",&local);
	while((local < 1)||(local > getLength(L))){
		printf("输入的元素位置不合法,请重新输入!\n");
		scanf("%d",&local);
	}
	if(local == 1){
		N = L;
		ele = N->data;
		L = L->next;
		free(N);
	}
	else{
		P = L;
		while(i+1 < local){
			i++;
			P = P->next;
		}
		N = P->next;
		ele = N->data;
		P->next = P->next->next; 
		free(N);
	}
	printf("删除元素操作成功!\n");
	printlist(L);
	return ele;
}
//查(按值)
void search(linkList &L){
	int ele,i;
	listNode* N;
	N = L;
	i = 1;
	printf("请输入你要查找的元素:\n");
	scanf("%d",&ele);
	while(N != NULL){
		if(N->data == ele){
			printf("已成功查找该元素,该元素的位置是%d\n",i);
			return;
		}
		i++;
		N = N->next;
	}
	printf("未在此链表中找到该元素!\n");
}
//查(按位) 
void searchlocal(linkList &L){
	int local,i,ele;
	listNode* N;
	N = L;
	i = 1;
	printf("请输入你要查找的元素的位置:\n");
	scanf("%d",&local);
	while((local<1)||(local>getLength(L))){
		printf("输入的位置不合法,请重新输入!\n");
		scanf("%d",&ele);
	}
	while(i < local){
		i++;
		N = N->next;
	}
	ele = N->data;
	printf("此链表中%d的元素是%d\n",local,ele);
}
//改 
void change(linkList &L){
	int local,ele,i;
	listNode* N;
	N = L;
	i = 1;
	printf("请输入你想要修改的元素大小以及位置:\n");
	scanf("%d %d",&ele,&local);
	while((local < 1)||(local > getLength(L))){
		printf("输入的位置不合法,请重新输入!\n");
		scanf("%d",&local);
	}
	while(i < local){
		i++;
		N = N->next;
	}
	N->data = ele;
	printf("修改完毕!\n");
	printlist(L);
}
int main(){
	linkList L;
	initialist(L);
	judge(L);
	//setlinkList(L);
	setListrear(L);
	add(L); 
	printf("删除的元素是%d\n",delelem(L));
	search(L);
	searchlocal(L);
	change(L);
	return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值