单链表基本操作

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

void InitList(LinkList L,int n)
{
    int i;
    LinkList p;
    if(L==NULL)
        exit(0);
    L->data=n;
    L->next=NULL;
    for(i=1;i<=n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&(p->data));
        p->next=L->next;
        L->next=p;
    }
}

void print(LinkList L)
{
    LinkList p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d/t",p->data);
        p=p->next;
    }
    printf("/n");
}

void InsertFront(LinkList L,int value)
{
    LinkList p;
    p=(LinkList)malloc(sizeof(LNode));
    p->data=value;
    p->next=L->next;
    L->next=p;
}

void InsertBack(LinkList L,int value)
{
    LinkList p,q;

    p=(LinkList)malloc(sizeof(LNode));
    p->data=value;

    q=L;
    while(q->next!=NULL)
    {
        q=q->next;
    }
    p->next=q->next;
    q->next=p;
}

void InsertAt(LinkList L,int pos,int value)
{
    LinkList p,q;
    int i;

    p=(LinkList)malloc(sizeof(LNode));
    p->data=value;

    q=L;i=1;
    while(q->next!=NULL&&i<pos)
    {
        q=q->next;
        i++;
    }
    if(q!=NULL&&i==pos)
    {
        p->next=q->next;
        q->next=p;
    }
}

void DeleteFront(LinkList L,int *value)
{
    LinkList p;
    if(L->next==NULL)
        exit(0);
    p=L->next;
    *value=p->data;
    L->next=p->next;
}

void DeleteBack(LinkList L,int *value)
{
    LinkList p,q;

    p=L->next;
    q=L;
    while(p->next!=NULL)
    {
        q=p;
        p=p->next;
    }
    *value=p->data;
    q->next=p->next;
}

void DeleteAt(LinkList L,int *value,int pos)
{
    LinkList p,q;
    int i;
    p=L->next;
    q=L;
    i=1;
    while(p->next!=NULL&&i<pos)
    {
        i++;
        q=p;
        p=p->next;
    }
    *value=p->data;
    q->next=p->next;
}

LinkList LocateAt(LinkList L,int pos)
{
    LinkList p,q,res;
    int i;


    p=L->next;
    i=1;
    while(p!=NULL&&i<pos)
    {
        i++;
        p=p->next;
    }
    if(p!=NULL&&i==pos)
    {
        res=p;
    }
    else
        res=NULL;
    return res;
}

int FindElem(LinkList L,int value)
{
    int i;
    LinkList p;

    p=L->next;
    i=1;
    while(p!=NULL)
    {
        if(p->data==value)
        {
            break;
        }
        else
        {
            i++;
            p=p->next;
        }
    }
    if(p!=NULL)
    {
        return i;
    }
    else
        return 0;
}

int CountElem(LinkList L,int value)
{
    int cnt;
    LinkList p;

    p=L->next;
    cnt=0;
    while(p!=NULL)
    {
        if(p->data==value)
            cnt++;
        p=p->next;
    }
    return cnt;
}

void MergeList(LinkList La,LinkList Lb)
{
    LinkList p,q;

    p=Lb->next;
    while(p->next!=NULL)
    {
        InsertBack(La,p->data);
        p=p->next;
    }
}

    

int main()
{
    LinkList ML,result;
    int size,val;
    int i,la,lb;
    LinkList Ma,Mb;
    size=3;
    result=(LinkList)malloc(sizeof(LNode));
    ML=(LinkList)malloc(sizeof(LNode));
    Ma=(LinkList)malloc(sizeof(LNode));
    Mb=(LinkList)malloc(sizeof(LNode));
    Ma->next=NULL;
    Mb->next=NULL;
    for(i=1;i<9;i++)
    {
        InsertFront(Ma,i+14);
        InsertFront(Mb,i+37);
    }
    print(Ma);
    print(Mb);
    MergeList(Ma,Mb);
    print(Ma);
    InitList(ML,size);
    printf("Print the LinkList:/n");
    print(ML);
    InsertFront(ML,46);
    InsertBack(ML,34);
    InsertAt(ML,3,47);
    print(ML);
    DeleteFront(ML,&val);
    printf("%d is deleted/n",val);
    DeleteBack(ML,&val);
    printf("%d is deleted/n",val);
    DeleteAt(ML,&val,2);
    printf("%d is deleted/n",val);
    print(ML);
    result=LocateAt(ML,2);
    printf("%d/n",*result);
    val=FindElem(ML,48);
    if(val!=0)
    {
        printf("48 is found at %d./n",val);
    }
    else
        printf("48 is not found int ML./n");
    val=CountElem(ML,53);
    if(val!=0)
    {
        printf("53 has been found %d times./n",val);
    }
    else
        printf("53 is not found int ML./n");
    getch();
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值