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=0;int j=1;int i; printf("请选择:1.继续查询\n2.结束查询\n"); printf("请输入选择:"); scanf("%d",&x); if(x==1){ 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=0;int j=1;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==0){ 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=0; p=L; printf("\n请选择插入位置:"); scanf("%d",&i); printf("\n请选择插入元素:"); scanf("%d",&e); while(p&&j<i-1){ p=p->next; ++j; } if(!p||j>i-1) { 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=0; p=L; printf("\n请输入要删除的位置:"); scanf("%d",&i); while(p->next&&j<i-1){ p=p->next; ++j; } if(!(p->next)||j>i-1) { 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<=0){ printf("\n输入链表长度不合法,请重新输入表长:"); scanf("%d",&i); } printf("\n请输入%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("\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=0,k,i=1,e=0,boo; L=NULL; printf("注:此测试过程输入值应全为数字\n\n"); printf("请用户选择存入数据或退出程序:\n\n"); printf("存入数据请输入:'1'\n\n"); printf("退出请选择'0'或 其它!!\n\n"); 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("查询成功!!\n\n"); else printf("查询失败!!\n\n"); break; case 2:boo=ListInser_L(L,i,e); if(boo) printf("\n插入成功!!\n\n"); else printf("插入失败!!\n\n"); break; case 3:boo=ListDelete_L(L,i,e); if(boo) printf("\n删除成功!!\n\n"); else printf("删除失败!!\n\n"); break; case 4:pr(L);break; case 5:ClearList(L);break; } OperateMenu(); scanf("%d",&k); } }else{ exit(OVERFLOW); } }