单链表

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

typedef struct Lnode {
    int data;
    Lnode *next;
}Lnode,*Linklist;


//初始化链表

bool iniLinklist(Linklist &l)
{
    l=(Lnode *)malloc(sizeof(Lnode));
    if(l == NULL)
        {
            printf("内存不足,创建头节点失败\n\n");
            return false;
        }
    l->next=NULL;
    printf("创建头节点成功\n\n");
    return true;

}


//判断链表是否为空

bool emptyLinklist(Linklist l)
{
    if(l->next==NULL)
        return true;
    return false;
}



//定位
Lnode *Getnodebyi(Linklist l,int i)
{   
    if(i<0)
    return NULL;
    Linklist p;
    p=l;
    int j=0;
    while(p!=NULL && j<i)
        {
            p=p->next;
            j++;
        }
    return p;
}


//按值
bool Getnodebyvalue(Linklist l,int value)
{   
    int j=1;
    Lnode *p=l->next;
    while(p!=NULL && p->data!=value)
        {
            p=p->next;
            j++;
        }
    if(p== NULL)
       
       {
        printf("链表为空\n");
        return false;
       }
    printf("值为%d的节点的位序为%d\n",value,j);
    return true;
    
} 


//前插
bool nodeinsertprior(Lnode *p,int value)
{
    if(p == NULL)
        return false;
    Lnode *s=(Lnode *)malloc(sizeof(Lnode));
    if(s == NULL)
        return false;
    s->next=p->next;
    p->next=s;
    s->data=p->data;
    p->data=value;
    printf("前插法插入节点成功\n\n");
    return true;
}



//后插
bool nodeinsertnext(Lnode *p,int value)
{
    if(p == NULL)
        return false;
    Lnode *s=(Lnode *)malloc(sizeof(Lnode));
    if(s == NULL)
        return false;
    s->data=value;
    s->next=p->next;
    p->next=s;
    printf("后插法插入节点成功\n\n");
    return true;
}



//插入节点

bool insertLinklist(Linklist &l,int i,int value)
{
    if(i<1)
        return false;
    Lnode *p=Getnodebyi(l,i-1);
    printf("1:选择前插法\n");
    printf("2:选择后插法\n");
    int choice= 0;
    scanf("%d",&choice);
    if(choice == 2)
        return nodeinsertnext(p,value);     
    else if(choice == 1)
        return nodeinsertprior(p,value);
} 


//删除节点

bool Linklistdelete(Linklist &l,int i ,int &value)
{
    if (i < 1)
        return false;
    Lnode *p=Getnodebyi(l,i-1);
    if(p == NULL)
        return false;
    if(p->next== NULL)
        return false;
    Linklist q = p->next;
    value=q->data;
    p->next=q->next;
    free(q);
    q=NULL;
    
    return true;
}

bool Linklistlength(Linklist l)
{
    int length =  0;
    Lnode *q = l;
    int i=0;
    while(q->next!=NULL)
    {
        q=q->next;
        length++;
    }
    // for(;q->next!=NULL;i++)
    // {
    //     q=q->next;
    // }
    printf("单链表的长度为%d\n",length);
    return true;
}




void menu()
{
    printf("请选择功能\n");
    printf("1:退出\n");
    printf("2:插入节点\n");
    printf("3:删除节点\n");
    printf("4:按位查找\n");
    printf("5:按值查找\n");
    printf("6:求表的长度\n");
    printf("7:打印出链表\n");
}


int main()
{   
    Linklist l;
    iniLinklist(l);
    int option,i,value=0;
    int j=1;
    Lnode *p=NULL;
    if(emptyLinklist(l))
    {
        printf("单链表目前为空\n\n");
    }

    while(1){
        menu();
        scanf("%d",&option);
        if(option == 1)
        {
            printf("退出\n\n");
            break;
        }
        switch(option)
        {
            case 2:
            
             
                printf("请输入节点位序以及值\n");
                scanf("%d %d",&i,&value);
                insertLinklist(l,i,value);
                break;
             

            case 3:
                
                
                printf("请输入要删除的节点位序\n");
                scanf("%d",&i);
                if(Linklistdelete(l,i,value))
                    {
                        printf("删除节点成功\n\n");
                    }
                else

                    printf("删除节点失败\n\n");
                break;
                
                
            case 4:
             
                printf("请输入节点的位序\n");
                scanf("%d",&i);
                p=Getnodebyi(l,i);
                printf("第%d个节点的值为%d\n\n",i,p->data);
              
                break;
                
            

            case 5:
            
                printf("请输入值来查找位序\n");
                scanf("%d",&value);
                Getnodebyvalue(l,value);
                break;
            

            case 6:
             
             
                Linklistlength(l);
                break;

            case 7:
                while(Getnodebyi(l,j)!=NULL)
                    {   
                        
                        printf("位序为%d的值为%d\n",j,Getnodebyi(l,j)->data);
                        j++;
                    }
                j=1;
                break;
        }
    }
        
    
    

    system("pause");
    return 0;
}