单链表(自学复习考研用)(添加单循环链表)

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;
LinkList List_HeadInsert(LinkList &L){ //头插法
    LNode *s; 
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    if (L==NULL)
    {
        printf("内存分配不成功\n");
    }
    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
LinkList List_TailInsert(LinkList &L)//尾插法
{
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s,*r=L;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;                  //把原尾指针指向新添加元素
        r=s;                        //更新原尾指针为新尾指针
        scanf("%d",&x);   
    }
    //r->next=NULL;                  //尾节点指针置空(结尾了没有下一个元素被指出故删去置空)
    r->next=L;             //循环单链表,尾指针指向首节点      
    return L;
}
void print(LinkList L)   //打印链表
{
    LNode *i=L;
    printf("当前单链表中元素为:");
    //while(i->next !=NULL)       //非循环单链表的判断
    while(i->next != L)   //循环单链表的判断
    {
        i=i->next;
        printf("%d\t",i->data);
    }
    printf("\n");
}
LNode *GetElem(LinkList L,int i)   //按序查找结点,返回指针
{
    if(i<1){
        return NULL;
    }
    int j=1;
    LNode *p=L->next;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
LNode *LocateElem(LinkList L,int e){ //按值查找元素,并且返回该元素指针
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e){
        p=p->next;
    }
    return p;
}
bool HeadInsetElem(LinkList &L,int i,int e){ //前插法在特定位置插入元素
    LNode* p=GetElem(L,i-1);
    LNode* s;
    s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    else {
        s->data=e;
        s->next=p->next;//该项与下一项不可换,否则造成指针覆盖丢失后续指针
        p->next=s;
    }
    return true;
}
bool TailInsertElem(LinkList &L,int i,int e){ //后插法特定位置插入元素
    LNode* p=GetElem(L,i);                    //如果已知特定结点的数据和指针,进行插入操作O(1)
    LNode* s;                                 //后插容易理解,前插就是先后插再交换数据即可
    s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    else{
        s->data=e;
        s->next=p->next;
        p->next=s;
    }
    return true;

}     
int Length(LinkList L){
    int len=0;
    if(L==NULL) return 0;
    while(L->next){
        len++;
        L=L->next;
    }
    return len;
}                                        
bool DeleteElem(LinkList &L,int i){
    LNode* q=GetElem(L,i-1);   //被删除指针的前驱
    LNode* p=q->next;    //指向被删除结点的指针
    p=q->next;                //被删除的后继
    q->next=p->next;       //把后继给前驱
    free(p);
    return 0;
}

int main()
{ 
    LNode* p;
    int i,e;
    bool x;
    LinkList L=NULL;
    while (1){
        printf("****************************************\n");
        printf("请输入想进行的操作?\n");
        printf("1.头插法建立单链表  2.尾插法建立单链表\n");
        printf("3.按照序号查找节点数据    4.按照值查找结点\n");
        printf("5.添加新结点         6.删除结点\n");
        printf("7.求表长    输入0以退出程序\n");  
        printf("*****************************************\n");
        scanf("%d",&i);
        if(i==0) break;
        switch(i){
            case 1:
                printf("输入单链表数据:\n");
                List_HeadInsert(L);break;   //实现头插法
            
            case 2:
                printf("输入单链表数据:\n");
                List_TailInsert(L); break;   //实现尾插法
            
            case 3:
                printf("输入想查找数据的位数\n");
                scanf("%d",&i);
                p=GetElem(L,i);
                printf("该数据为%d\n",p->data);
                break;
            
            case 4:
                printf("输入想查找的数字:\n");
                scanf("%d",&i);
                p=LocateElem(L,i);
                if(p){
                    printf("查找成功!\n");
                }
                else{
                    printf("查找失败,表内不存在\n");
                }
               break;
            case 5:
                printf("请输入想要插入的次序和数据");
                scanf("%d%d",&i,&e);
                x=TailInsertElem(L,i,e);
                if(x)printf("成功插入\n");
                else printf("插入失败\n");
                break;
            case 6:
                printf("请输入你想删除结点的序号\n");
                scanf("%d",&i);
                DeleteElem(L,i);
            break;
            case 7:
                i=Length(L);
                printf("所求表长为:%d\n",i);break;
            default:
                printf("输入错误\n");
                break; 
        }
        print(L);                       //查看建成的单链表
    } 
}
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;
LinkList List_HeadInsert(LinkList &L){ //头插法
    LNode *s; 
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    if (L==NULL)
    {
        printf("内存分配不成功\n");
    }
    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
LinkList List_TailInsert(LinkList &L)//尾插法
{
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s,*r=L;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;                  //把原尾指针指向新添加元素
        r=s;                        //更新原尾指针为新尾指针
        scanf("%d",&x);   
    }
    r->next=NULL;                  //尾节点指针置空(结尾了没有下一个元素被指出故删去置空)
    return L;
}
void print(LinkList L)   //打印链表
{
    LNode *i=L;
    printf("当前单链表中元素为:");
    while(i->next !=NULL)
    {
        i=i->next;
        printf("%d\t",i->data);
    }
    printf("\n");
}
LNode *GetElem(LinkList L,int i)   //按序查找结点,返回指针
{
    if(i<1){
        return NULL;
    }
    int j=1;
    LNode *p=L->next;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
LNode *LocateElem(LinkList L,int e){ //按值查找元素,并且返回该元素指针
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e){
        p=p->next;
    }
    return p;
}
bool HeadInsetElem(LinkList &L,int i,int e){ //前插法在特定位置插入元素
    LNode* p=GetElem(L,i-1);
    LNode* s;
    s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    else {
        s->data=e;
        s->next=p->next;//该项与下一项不可换,否则造成指针覆盖丢失后续指针
        p->next=s;
    }
    return true;
}
bool TailInsertElem(LinkList &L,int i,int e){ //后插法特定位置插入元素
    LNode* p=GetElem(L,i);                    //如果已知特定结点的数据和指针,进行插入操作O(1)
    LNode* s;                                 //后插容易理解,前插就是先后插再交换数据即可
    s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    else{
        s->data=e;
        s->next=p->next;
        p->next=s;
    }
    return true;

}     
int Length(LinkList L){
    int len=0;
    if(L==NULL) return 0;
    while(L->next){
        len++;
        L=L->next;
    }
    return len;
}                                        
bool DeleteElem(LinkList &L,int i){
    LNode* q=GetElem(L,i-1);   //被删除指针的前驱
    LNode* p=q->next;    //指向被删除结点的指针
    p=q->next;                //被删除的后继
    q->next=p->next;       //把后继给前驱
    free(p);
    return 0;
}

int main()
{ 
    LNode* p;
    int i,e;
    bool x;
    LinkList L=NULL;
    while (1){
        printf("****************************************\n");
        printf("请输入想进行的操作?\n");
        printf("1.头插法建立单链表  2.尾插法建立单链表\n");
        printf("3.按照序号查找节点数据    4.按照值查找结点\n");
        printf("5.添加新结点         6.删除结点\n");
        printf("7.求表长    输入0以退出程序\n");  
        printf("*****************************************\n");
        scanf("%d",&i);
        if(i==0) break;
        switch(i){
            case 1:
                printf("输入单链表数据:\n");
                List_HeadInsert(L);break;   //实现头插法
            
            case 2:
                printf("输入单链表数据:\n");
                List_TailInsert(L); break;   //实现尾插法
            
            case 3:
                printf("输入想查找数据的位数\n");
                scanf("%d",&i);
                p=GetElem(L,i);
                printf("该数据为%d\n",p->data);
                break;
            
            case 4:
                printf("输入想查找的数字:\n");
                scanf("%d",&i);
                p=LocateElem(L,i);
                if(p){
                    printf("查找成功!\n");
                }
                else{
                    printf("查找失败,表内不存在\n");
                }
               break;
            case 5:
                printf("请输入想要插入的次序和数据");
                scanf("%d%d",&i,&e);
                x=TailInsertElem(L,i,e);
                if(x)printf("成功插入\n");
                else printf("插入失败\n");
                break;
            case 6:
                printf("请输入你想删除结点的序号\n");
                scanf("%d",&i);
                DeleteElem(L,i);
            break;
            case 7:
                i=Length(L);
                printf("所求表长为:%d\n",i);break;
            default:
                printf("输入错误\n");
                break; 
        }
        print(L);                       //查看建成的单链表
    } 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值