单链表实现

#include<stdio.h>
#include<stdlib.h>
typedef  int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList initList();
int insertList(LinkList head, int pos, ElemType e);
int GetIndex(LinkList head, ElemType e);
//初始化
LinkList initList()
{
    LNode *H;
    H=(LNode*)malloc(sizeof(LNode));
    if(!H)return NULL;
    H->next=NULL;
    return H;

}
//插入
int insertList(LinkList head, int pos, ElemType e)
{
          if(pos<1)return 0;
    LNode *p=head,*s;
    int j;
    for(j=1;j<pos;j++)
    {
              if(p->next==NULL)return 0;
              p=p->next;
    }
          s=(LNode*)malloc(sizeof(LNode));
                              s->data=e;
                              s->next=p->next;
                              p->next=s;
                              return 1;
                              }

//删除
int deleteList(LinkList head, int pos ,ElemType *e)
{
    if(pos<1)
    {
        printf("error\n");
        return 0;
    }
    LNode *p=head;
    int i;
    for(i=1;i<pos&&p->next!=NULL;i++)
        p=p->next;
        if(p->next==NULL||i>pos)
        {
            printf("error\n");
            return 0;
        }
    LNode* q=p->next;
    p->next=q->next;
    printf("%d\n",q->data);
    free(q);
    return 1;
}

//补充查找算法:若找到返回e在链表中位置,未找到返回0
int getIndex(LinkList head, ElemType e)
{
   LNode*p=head,*s;
   int j=0;
   while(p->next!=NULL)
   {
             p=p->next;
             j++;
             if(p->data==e)return j;
   }
return 0;
}

//输出链表
void printList(LinkList head)
{
    LNode *p=head->next;
    while(p!=NULL)
          {
          printf("%d ",p->data);
          p=p->next;
          }
}

int main()
{
    LinkList head;
    ElemType e;
    int i,n;
    scanf("%d",&n);
    head=initList();
    //用insertList函数的建表方法
    for(i=0;i<n;i++)
    {
        scanf("%d",&e);
        insertList(head,i+1,e);
    }
    //不用insertList函数的建表方法
    /*LNode *p,*p1;
    p=head;
    for(i=1;i<=n;i++){
        p1=(LNode*)malloc(sizeof(LNode));
        scanf("%d",&e);
        p1->data=e;
        p1->next=NULL;
        p->next=p1;
        p=p->next;
    }*/
    //补充代码,实现若干个关键字值得查找
char b;int f=1,a=0;
    while(1)
    {
        b=getchar();
        if(b>='0'&&b<='9')
        {
            a=a*10+(int)b-48;
            f=2;
        }
        else if(b=='-')f=0;
        else if(b=='\n'||b==' ')
        {
            if(!f)a=a*(-1);
            if(!f&&a==0)break;
            if(a!=0||f==2)
            {
                i=getIndex(head,a);
                if(i)printf("%d\n",i);
                else printf("no\n");
            }
            a=0;f=1;
        }
        else break;
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值