【创】MyLinkList【链表-单】

本文主要介绍如何创建和操作单链表,包括链表节点的定义、插入、删除等基本操作,帮助理解链表数据结构。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<stdlib.h>

typedef struct LinkListNode{
	int  data;       //数据域
	struct LinkListNode  *next;   //指针域
}LNode, *LinkList;   

void CreateList(LinkList &L, int n); // 创建n个结点的链表 

void PrintList(LinkList L); // 打印链表 

// 根据序号查找 
// 返回序号为i(序号从1开始)的结点的地址,找不到返回NULL 
LNode* FindI(LinkList L, int i); 

// 根据值查找
// 返回值为e的第一个节结点的地址,找不到返回NULL 
LNode* FindV(LinkList L, int e);

// 根据序号查找前驱 
// 返回序号为i(序号从1开始)的结点的前驱结点的地址,找不到返回NULL 
LNode* FindIP(LinkList L, int i); 

// 根据值查找前驱 
// 返回值为e的第一个结点的前驱结点的地址,找不到返回NULL 
LNode* FindVP(LinkList L, int e); 

// 在位置i(从1开始)插入元素e 
// 成功返回1,失败返回0 
int Insert(LinkList &L, int i, int e); 

// 删除位置i的元素 
// 成功返回1,失败返回0 
int Del(LinkList &L, int i); 

int main(){
	LinkList L;
	int cmd, e, n, i;
	LNode *p;
	int re;
	scanf("%d", &n);
	CreateList(L, n); 
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			PrintList(L);
			break;
		case 1: // 根据序号查找 
			scanf("%d", &i);
			p = FindI(L, i);
			if ( p!=NULL) printf("%d\n", p->data);
			else printf("Not Found\n");
			break; 
				
		case 2: // 根据值查找 
			scanf("%d", &e);
			p = FindV(L, e);
			if ( p!=NULL) printf("%d\n", p->data);
			else printf("Not Found\n");
			break; 
			
		case 3: // 根据序号查找前驱 
			scanf("%d", &i);
			p = FindIP(L, i);
			if ( p!=NULL) printf("%d\n", i-1);
			else printf("Not Found\n");
			break; 
			
		case 4: // 根据值查找前驱 
			scanf("%d", &e);
			p = FindVP(L, e);
			if ( p!=NULL) printf("%d\n", p->next->data);
			else printf("Not Found\n");
			break; 
			
		case 5: // 在位置i插入元素e
			scanf("%d %d", &i, &e);
			re = Insert(L, i, e);
			if (re) printf("OK\n");
			else printf("ERROR\n");
			break; 
				
		case 6: // 删除位置i的元素 
			scanf("%d", &i);
			re = Del(L, i);
			if (re) printf("OK\n");
			else printf("ERROR\n");
			break; 
			
		default:
			printf("Unknow Command.\n");
			break;
		}
	}
	return 0;
} 

void CreateList(LinkList &L, int n){
	L = new LNode;//创建一个新的头结点【只有指针域没有数据域】
	LNode *p = L;//创建一个指向结点的指针p并使得p指向头结点
	if(n==0){
		L->next=NULL;
	}
	while(n--){
		LNode *a = new LNode;//创建一个结点 用new 
		scanf("%d",&a->data);
		a->next = NULL;
		p->next = a;
		p = p->next;
	}
}

void PrintList(LinkList L){
	LNode *p = L->next;//p直接指向第一个结点【有数据域和指针域】
	while(p!=NULL){//最后一次循环会使得p指向最后一个结点的next所指向的NULL
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

// 根据序号查找 
// 返回序号为i(序号从1开始)的结点的地址,找不到返回NULL 
LNode* FindI(LinkList L, int i){
	LNode *p = L->next;
	int index = 1;
	if(i<1)return NULL;
	while(p!=NULL){
		if(index==i){
			return p;
		}
		p = p->next;
		index++;
	}
	return NULL;
}

// 根据值查找
// 返回值为e的第一个节结点的地址,找不到返回NULL 
LNode* FindV(LinkList L, int e){
	LNode *p = L->next;
	while(p!=NULL){
		if(e==p->data){
			return p;
		}
		p = p->next;
	}
	return NULL;
}

// 根据序号查找前驱 
// 返回序号为i(序号从1开始)的结点的前驱结点的地址,找不到返回NULL 
LNode* FindIP(LinkList L, int i){
	if(i==1){
		return L;//如果是第一个位置 直接返回头结点
	}
	LNode *p = L->next;//这里p不能直接指向L头结点 如果指向 会导致后面的while进不了循环 L的数据域是NULL
	int index = 1;
	while(p!=NULL){
		if(index == i-1){
			return p;
		}
		index++;
		p = p->next;
	}
	return NULL;
}

// 根据值查找前驱 
// 返回值为e的第一个结点的前驱结点的地址,找不到返回NULL 
LNode* FindVP(LinkList L, int e){
	LNode *p = L;
	while(p->next!=NULL){
		if(p->next->data == e){
			return p;
		}
		p = p->next;
	}
	return NULL;
}

// 在位置i(从1开始)插入元素e 
// 成功返回1,失败返回0 
int Insert(LinkList &L, int i, int e){
	LNode *p = FindIP(L,i);//p指向要插入位置的前面位置
	if(p==NULL)return 0;
	LNode *a = new LNode;
	a->data = e;
	a->next = p->next;
	p->next = a;
	return 1;
}

// 删除位置i的元素 
// 成功返回1,失败返回0 
int Del(LinkList &L, int i){
	if(L->next==NULL){//这里是说明当L是空表时 无法删除
		return 0;
	}
	LNode *p = FindIP(L, i);
	if(!p||!p->next) return 0;
	LNode *r = p->next;
 	p->next = r->next;
	delete r;
	return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值