c_数据结构_链表

时间:2023-03-09 09:19:43
c_数据结构_链表
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2 typedef struct Lnode{
int data;
struct Lnode *next;
}LNode,*LinkList;
//初始化一个空指针
int InitList_L(LinkList &L){ L=(LNode *)malloc(sizeof(struct Lnode));
// L->data=info;
L->next=NULL; return OK; }
//查找元素
int Yin(LinkList L,int &r){
LinkList p;int x=;int j=;int i; printf("请选择:1.继续查询\n2.结束查询\n");
printf("请输入选择:");
scanf("%d",&x);
if(x==){
printf("\n请选择查询元素位置:");
scanf("%d",&i);
p=L->next;
while(p&&j<i){
// printf("*****\n");
p=p->next;
++j;
}
if(!p||j>i){
printf("\n查询位置不在列表内!!\n\n");
//return ERROR;
Yin(L,r);
}else{return ERROR;}
//return OK;
}
// printf("******");
return OK; } int GetElem_L(LinkList L,int i,int &e){
LinkList p;int x=;int j=;int r,h;
printf("\n请选择查询元素位置:");
scanf("%d",&i);
p=L->next; while(p&&j<i){
// printf("*****\n");
p=p->next;
++j;
}
if(!p||j>i){
printf("\n查询位置不在列表内!!\n\n");
h=Yin(L,r);
if(h==){
return ERROR;
}else{
e=p->data;
printf("\n查找的%d位置的元素为:%d\n\n",i,e);
return OK;
}
}
return OK;
}
//插入元素
ListInser_L(LinkList &L,int i,int e){
LinkList p,s;int j=;
p=L;
printf("\n请选择插入位置:");
scanf("%d",&i);
printf("\n请选择插入元素:");
scanf("%d",&e);
while(p&&j<i-){
p=p->next;
++j;
}
if(!p||j>i-)
{
printf("\n插入位置不在链表长度内!!\n\n");
return ERROR;
}
s=(LNode*)malloc(sizeof(struct Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
// 删除元素
int ListDelete_L(LinkList &L,int i,int e){
LinkList p,q;int j=;
p=L;
printf("\n请输入要删除的位置:");
scanf("%d",&i);
while(p->next&&j<i-){
p=p->next;
++j;
}
if(!(p->next)||j>i-) {
printf("\n删除的位置不在链表长度内!!\n\n");
return ERROR;
}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
} //创建链表
int creatlist(LinkList &L){
int i;
LinkList p,q;
if(L==NULL)
InitList_L(L);
q=L;
printf("\n请输入链表长度:");
scanf("%d",&i);
while(i<=){
printf("\n输入链表长度不合法,请重新输入表长:");
scanf("%d",&i);
}
printf("\n请输入%d个数:",i);
for(i;i>;i--){
p=(LNode*)malloc(sizeof(struct Lnode));
p->next=NULL;
scanf("%d",&p->data);
q->next=p;
q=p;
}
printf("\n输入成功!!\n\n");
return OK; }
//打印链表中的元素
int pr(LinkList L){
LinkList q;
q=L->next;
printf("\n表中存储元素为:\n");
while(q!=NULL){
printf("%d\n",q->data);
q=q->next;
}
return OK;
}
//清空链表,只保留头结点
void ClearList(LinkList &L){
LinkList p;
while(L->next){
p=L->next;
L->next=p->next;
free(p);
}
printf("清空链表成功!!\n\n");
creatlist(L);
}
void OperateMenu(){ //操作菜单 printf("--------------请选择元素处理方式---------\n\n");
printf("0> 退出\n\n");
printf("1>: 查找给定位置的数据\n\n");
printf("2>: 插入元素\n\n");
printf("3>: 删除元素\n\n");
printf("4>: 打印元素\n\n");
printf("5>: 释放原链表,重新创建新链表\n\n");
printf("请选择对元素的处理:"); } void main(){
LinkList L; int w=,k,i=,e=,boo;
L=NULL;
printf("注:此测试过程输入值应全为数字\n\n");
printf("请用户选择存入数据或退出程序:\n\n");
printf("存入数据请输入:'1'\n\n");
printf("退出请选择'0'或 其它!!\n\n");
printf("请选择:");
scanf("%d",&w);
if(w==){
InitList_L(L);
creatlist(L);
OperateMenu();
scanf("%d",&k);
while(k){
switch(k){
case :break;
case :boo=GetElem_L(L,i,e);
if(boo)
printf("查询成功!!\n\n");
else
printf("查询失败!!\n\n");
break;
case :boo=ListInser_L(L,i,e);
if(boo)
printf("\n插入成功!!\n\n");
else
printf("插入失败!!\n\n");
break;
case :boo=ListDelete_L(L,i,e);
if(boo)
printf("\n删除成功!!\n\n");
else
printf("删除失败!!\n\n");
break;
case :pr(L);break;
case :ClearList(L);break;
}
OperateMenu();
scanf("%d",&k); }
}else{
exit(OVERFLOW);
} }