单链表对元素的插入 删除 和查找
在这里插入代码片
#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;
}
}
}
删除线格式
- List item