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);
    }

}

 

posted @ 2018-11-16 19:55  yin_zhaozhao  阅读(150)  评论(0编辑  收藏  举报