线性表的单链表实现

    

  玩玩课本的数据结构感觉也还挺好玩的。虽然,理论性很强但是却增加了我的很多学术性的知识,感觉挺有收获的。

/*
    线性表的单链表实现插入删除和查找及创建
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ElemType int
#define Status bool

//-------线性表的单链表存储结构----------
/*
    若线性表为空表,则头结点的指针为“空”
*/
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status GetElem_L(LinkList L,int i,ElemType &e)
{
    //L带头结点的单链表的头指针
    //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR

    int j;
    LinkList p;
    p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器
    while(p&&j < i){
        p = p->next; ++j;
    }
    if(!p||j>i)
        return false;
    e = p->data;
    return true;
}  //GetElem_L

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    //带头结点的单链表线性表L中第i个位置之前插入元素e
    int j;
    LinkList p,s;
    p = L->next; j = 1;
    while(p&&j < i){   //寻找i-1个结点
        p = p->next;
        ++j;
    }
    if(!p||j>i)
        return false;
    s = (LinkList)malloc(sizeof(LNode));    //生成新结点
    /*     注意赋值的前后顺序        */
    s->data = e; s->next = p->next;        //插入L中
    p->next = s;
    return true;
}

Status ListDelete_L(LinkList &L,int i,ElemType &e){
    //带头结点的单链表线性表L中,删除第i个元素,并由e返回其值
    int j;
    LinkList p,q;
    p = L; j = 1;

    /*
       注意判断条件是 p->next 提前判断条件是否满足
       因为,要删除第i个则要先从第i-1个的Next得到
       所以,如果第i-1个Next为空说明第i个已经超出
       数据范围了。
    */
    while(p->next&&j < i){      //寻找第i个结点,并令p指向其前驱
        p = p->next;
        ++j;
    }
    if(!(p->next)||j > i)     // 删除位置不合理
        return false;
    q = p->next; p->next = q->next;  //删除并释放结点
    e = q->data; free(q);
    return true;
}//  ListDelete_L

void CreateList_L(LinkList &L,int n)
{
    //逆位序输入n个元素的值,建立带头结点的单链线性表L
    LinkList p;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;     //先建立一个带头结点的单链表
    for(int i = n;i > 0;--i){
        p = (LinkList)malloc(sizeof(LNode));  //生成新结点
        scanf("%d",&p->data);
        p->next = L->next; L->next = p;     // 插入到表头
    }
}  //CreateList_L

int main()
{
    int n,pos,e;
    LinkList L,p;
    printf("Please enter you want to how many number: ");

    scanf("%d",&n);
    CreateList_L(L,n);
    puts("You enter number is: ");
    p = L->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
    puts("");

    //输入你要删除元素的位置
    printf("Please input you want to delete number position: ");
    scanf("%d",&pos);
    if(ListDelete_L(L,pos,e)){
         printf("You Delete number is: %d\n",e);
         puts("Delete After:");
         p = L->next;
         while(p){
            printf("%d ",p->data);
            p = p->next;
         }
         puts("");
    }
    else{
        printf("Sorry!Delete error!");
    }
    //输入你要插入元素的位置和元素值
    printf("Please input you want to insert position and number value: ");
    scanf("%d%d",&pos,&e);
    if(ListInsert_L(L,pos,e)){
        printf("Insert successful!");
        puts("Insert After:");
        p = L->next;
        while(p){
            printf("%d ",p->data);
            p = p->next;
        }
        puts("");
    }
    else{
        printf("Insert Error!");
    }
    //输入你要获得的元素位置
    printf("Please input you want to get number position: ");
    scanf("%d",&pos);
    if(GetElem_L(L,pos,e)){
        printf("You want to get number is: %d\n",e);
    }
    else{
        printf("Sorry get number Error!");
    }

    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值