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