C语言之单链表的使用

#include <stdio.h>
#include <stdlib.h>
typedef struct  LNode{
    int    data;
    struct LNode    *next;
}LNode, *LinkList;
void GetElem_L(LinkList L,int i,int e){
    //L为带头结点的单链表的头指针。
    //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    LNode *p = L->next;int j = 1;
    while(p&&j<i){
        p = p->next;++j;
    }
    e = p->data;
    printf("获取的值:%d\n",e);
    }//GetElem_L
void ListInsert_L(LinkList L,int i,int e){
//在带头节点的单链线性表L中第i个人位置之前插入元素e
    LinkList p = L; int j=0;
    while(p&&j<i-1){p=p->next;++j;} //寻找第i-1个节点。
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;s->next = p->next;
    p->next = s; 
    printf("插入成功。");
}//ListInsert_L
int ListDelete_L(LinkList L,int i,int e)
{
    LinkList p = L;int j = 0;
    while(p->next&&j<i-1){//寻找第i个节点并令p指向其前趋
        p = p->next;  ++j; 
    }
    LNode *q = p->next; p->next = q->next;
    e = q->data; free(q);
    return e;
}//ListDelete_L
void CreateList_L(LinkList *L,int n){
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;  //建立一个带头结点的单链表
    for(int i = n;i>0;--i){
        LinkList p = (LinkList)malloc(sizeof(LNode));  //生成新的结点
        scanf("%d",&p->data);
        p->next = (*L)->next; (*L)->next = p; 
    } 
    printf("表格创建成功");
}//CreateList_L
void MergeList_L(LinkList La,LinkList Lb,LinkList Lc){
    //已知单链线性表La和Lb的元素按值非递减排列。
    //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
    LNode *pa = La->next; LNode *pb = pb->next;
    LNode *pc = Lc->next;
    Lc = pc = La;
    while(pa && pb){
        if(pa->data <= pb->data){
            pc->next = pa;pc = pa;pa = pa->next;
        }
        else{pc->next = pb;pc = pb;pb = pb->next;}
    } 
    pc->next = pa ? pa:pb;  //插入剩余段。
    free(Lb); 
}//MergeList_L
void main()
{
    LinkList L;
    int n;
    printf("请输入数据的数量:\n");
    scanf("%d",&n);
    CreateList_L(&L,n);
    printf("请选择你想要进行的操作:1代表插入元素;2代表获得元素;3代表删除元素;\n");
    int i;
    scanf("%d",&i);
    int g=1;
    while(g==1)
    {
        if(i==1){
            int e;
            printf("请输入你们要插入的元素:\n");
            scanf("%d",&e);
            printf("请输入你想要插入的位置:\n");
            int k;
            scanf("%d",&k);
            ListInsert_L(L,k,e);
            printf("请选择你是否要退出还是继续:1为继续;2为退出\n");
            g=0;
            scanf("%d",&g);
            printf("请选择你想要进行的操作:1代表插入元素;2代表获得元素;3代表删除元素;\n");
            i=0;
              scanf("%d",&i);
        }
        if(i==2){
            int e;
            printf("请输入你想要获取元素的位置:\n");
            int k;
            scanf("%d",&k);
            GetElem_L(L,k,e);
            printf("请选择你是否要退出还是继续:1为继续;2为退出\n");
            g=0;
            scanf("%d", &g);
            printf("请选择你想要进行的操作:1代表插入元素;2代表获得元素;3代表删除元素;\n");
            i=0;
              scanf("%d", &i);
        }    
        if(i==3){
            int e;
            printf("请输入你想要删除的位置:\n");
            int k;
            scanf("%d",&k);
            ListDelete_L(L,k,e);
            printf("请选择你是否要退出还是继续:1为继续;2为退出\n");
            g=0;
            scanf("%d", &g);
            printf("请选择你想要进行的操作:1代表插入元素;2代表获得元素;3代表删除元素;\n");
            i=0;
              scanf("%d", &i);
        }
        
    }
    return 0; 
}

 

posted @ 2016-09-30 22:52  旷野足迹  阅读(462)  评论(0编辑  收藏  举报