单链表的顺序操作


#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef int Status;
typedef struct node    
{
    Elemtype data;  
    struct node *next;
} node,*linklist; 
 
linklist creat(int n)
{
    linklist head,p; 
    int x,i;
    head=(node *)malloc(sizeof(node));
    head->next=NULL;
    printf("输入结点值:\n");
    for(i=n;i>0;i--) 
    {
        scanf("%d",&x);
        p=(node *)malloc(sizeof(node));
        p->data=x;
        p->next=head->next;
        head->next=p;
    }
    return head;
}
 
void output(linklist head)
{
    linklist p;
    p=head->next;
    while(p)
    {
        printf("%3d",p->data);
        p=p->next;
    }
    printf("\n");
}
 
Status insert(linklist &l,int i,Elemtype e) 
{
    int j=0;
    linklist p=l,s;
    while(j<i-1 && p)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        printf("插入失败,请输入合理的插入位置\n");
    else
    {
        s=(node *)malloc(sizeof(node));
        s->data=e;
        s->next=p->next;
        p->next=s;
    }
    return 1;
}
 
 
Status delect(linklist &l,int i,Elemtype &e)  
{
    int j=0;
    linklist p=l,q;
    while(j<i-1 && p)
    {
        p=p->next;
        ++j;
    }
    if(!p->next || j>i-1)
        printf("删除失败,请输入合理的删除位置\n");
    else
    {
        q=p->next;
        p->next=q->next;
        e=q->data;
        free(q);
    }
    return 1;
}
 
Status GetElem(linklist l,int i,Elemtype &e) 
 {
    linklist p=l->next;
    int j=1;
    while(p&&j<i)
    { 
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        printf("查找失败,请输入合理的查找位置\n");
    else
    {
        e=p->data;
        printf("查找成功,要查找的元素为%d\n",e);
    }     
    return 1;
 }
 
int main()
{
    linklist la;
    int n;
    int i;
    Elemtype e;
    char cmd;
    printf("输入链表元素的个数:");
    scanf("%d",&n);
    la=creat(n);
    printf("输出链表:\n");
    output(la);
    
    do
    {
        printf("g,G...查找\n");
        printf("i,I...插入\n");
        printf("d,D...删除\n");
        printf("q,Q...退出\n");
        do
        {
            scanf("%c",&cmd);
        }
        while((cmd!='g')&&(cmd!='G')&&(cmd!='d')&&(cmd!='D')&&(cmd!='q')&&(cmd!='Q')&&(cmd!='i')&&(cmd!='I'));
        switch(cmd)
        {
        case'g':
        case'G':
            printf("请输入要查找元素的位置:\n");
            scanf("%d",&i);
            GetElem(la,i,e);
            break;
        case'i':
        case'I':
            printf("请输入要插入的数据:");
            scanf("%d",&e);
            printf("请输入要插入的位置:");
            scanf("%d",&i);
            insert(la,i,e);
            output(la);
            break;
        case'd':
        case'D':
            printf("请输入要删除的位置:");
            scanf("%d",&i);
            delect(la,i,e);
            output(la);
            break;
        }
    }
    while((cmd!='q')&&(cmd!='Q'));
}

82f9840df5ef418d96924b8470ef414b.jpg

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值