#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;
}
【创】MyLinkList【链表-单】
最新推荐文章于 2023-05-25 13:17:18 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)