单向链表

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int elemtype;///定义类型,下次修改可以直接在这里修改
typedef struct node
{
    elemtype data;///数据域
    struct node *next;///指针域
}linklist;


linklist *initLinkList();///初始化链表


void creatLinkList(linklist *);///创建链表


void displayLinkList(linklist *);///输出链表


linklist *search_loc(linklist *,int );///查找链表的节点


void search_val(linklist *,elemtype ,int *);///查找链表的值


int del_loc(linklist *,int );///删除链表的节点


int del_val(linklist *,elemtype );///删除链表的值


int insert_loc(linklist *,int ,elemtype );///插入节点的值


int insert_val(linklist *,elemtype ,elemtype );///出入值的节点


void clear();///清屏


int main()
{
    int choice,loc,ok;
    elemtype m,n;
    linklist *L,*temp;///L是头结点,temp是接下来用来存地址使用的
    do{
        printf("\t\t\t*************************\n");
        printf("\t\t\t*1.初始化链表\t\t*\n");
        printf("\t\t\t*2.创建链表    \t\t*\n");
        printf("\t\t\t*3.输出链表    \t\t*\n");
        printf("\t\t\t*4.查找链表节点\t\t*\n");
        printf("\t\t\t*5.查找链表的值\t\t*\n");
        printf("\t\t\t*6.删除链表的节点\t*\n");
        printf("\t\t\t*7.删除链表的值的节点   *\n");
        printf("\t\t\t*8.插入链表的节点的值   *\n");
        printf("\t\t\t*9.插入链表的节点的值   *\n");
        printf("\t\t\t*0.退出      \t\t*\n");
        printf("\t\t\t*************************\n");
        printf("请输入你需要的操作数:");
        scanf("%d",&choice);
        if(choice==0)
            break;
        switch(choice)
        {
            case 1: L=initLinkList();break;///初始化链表之后得把地址赋值给L
            case 2: creatLinkList(L);break;
            case 3: displayLinkList(L);break;
            case 4: printf("请输入你需要查找的节点位置:");
                    scanf("%d",&loc);
                    temp=search_loc(L,loc);///查找到节点之后返回地址赋值给temp
                    if(temp==NULL)
                        printf("NULL\n");
                    else
                        printf("%p",temp);///%p是输出计算机的地址
                    break;
            case 5: loc=0;///初始化loc,如果没有查找到节点loc是0
                    printf("请输入你需要的查找的数值:");
                    scanf("%d",&n);
                    search_val(L,n,&loc);///loc传地址,在函数查找到后传回地址
                    if(loc==0)
                        printf("NULL");
                    else
                        printf("该数值在%d的位置\n",loc);
                    break;
            case 6: printf("请输入你需要删除的节点位置:");
                    scanf("%d",&loc);
                    ok=del_loc(L,loc);
                    if(ok)
                        printf("删除成功\n");
                    else
                        printf("删除失败\n");
                    break;
            case 7: printf("请输入你需要删除的值:");
                    scanf("%d",&n);
                    ok=del_val(L,n);
                    if(ok)
                        printf("删除成功\n");
                    else
                        printf("删除失败\n");
                    break;
            case 8: printf("请输入你要插入的位置:");
                    scanf("%d",&loc);
                    printf("请输入你要插入的值:");
                    scanf("%d",&n);
                    ok=insert_loc(L,loc,n);
                    if(ok)
                        printf("插入成功\n");
                    else
                        printf("插入失败\n");
                    break;
            case 9: printf("请输入你需要插入在某值的前面的值:");
                    scanf("%d",&m);
                    printf("请输入你需要插入的值:");
                    scanf("%d",&n);
                    ok=insert_val(L,m,n);
                    if(ok)
                        printf("插入成功\n");
                    else
                        printf("插入失败\n");
                    break;
            default:printf("输入错误,请重新输入\n");break;
        }
        clear();
    }while(1);


    return 0;
}


///初始化链表
linklist *initLinkList()
{
    linklist *L;
    L=(linklist *)malloc(sizeof(linklist));
    if(!L)
        printf("初始化失败\n");
    else
        printf("初始化成功\n");
    L->next=NULL;
    return L;///初始化完返回地址
}


///创建链表
void creatLinkList(linklist *L)
{
    linklist *p,*q,*temp;
    int num,data;
    temp=L;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    ///采取的是尾插法,再次进入的时候的尾插的头节点应该是链表的最后一个节点,继续插入
    p=temp;///未插入数据之前,头节点就是上一次链表的头节点
    printf("\t\t\t请输入你需要的添加数量:");
    scanf("%d",&num);
    printf("\t\t\t请输入%d个数据:",num);
    while(num--)
    {
        scanf("%d",&data);
        q=(linklist *)malloc(sizeof(linklist));
        q->data=data;
        q->next=p->next;
        p->next=q;
        p=q;
    }
}




///输出链表
void displayLinkList(linklist *L)
{
    linklist *p;
    p=L;
    printf("\t\t\t以下是链表的数据:");
    if(!p->next)///链表如果是空的应该立马输出空的,并返回
    {
        printf("NULL\n");
        return ;
    }
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d ",p->data);
    }
    printf("\n");
}


///查找链表的节点
linklist *search_loc(linklist *L,int loc)
{
    int position=0;
    linklist *p;
    p=L;
    if(!p->next)
    {
        ///链表为空的,输出NULL
        return NULL;///返回空地址
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(position==loc)///查找到节点并跳出
            break;
    }
    if(position==loc)
        return p;
    else
        return NULL;///查找不到返回空
}




///查找链表的值
void search_val(linklist *L,int n,int *loc)
{
    int position=0;
    linklist *p;
    p=L;
    if(!p->next)
    {
        ///链表为空的,输出NULL
        return ;///并返回
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(p->data==n)
            *loc=position;///loc是指针,只要让loc指向position的地址,返回的时候就可以改变loc的值
    }
    return ;
}


///删除链表的节点
int del_loc(linklist *L,int loc)
{
    int position=0,ok=0;
    linklist *p,*q;
    p=L;q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///删除失败返回0
    }
    while(q->next!=NULL)
    {
        q=q->next;///用q来查找需要删除的值
        ++position;
        if(position==loc)
        {
            p->next=q->next;///p是要删除的前一个,那只要它的next指向要删除的下一个地址就跳过了要删除的值
            free(q);///释放空间
            q=p;///释放完q得指向p,那样p的next也就是q的next,让q的链表正常,也就让L的链表连接正常
            ok=1;///删除成功
            break;
        }
        p=q;///这样一直循环就是p永远是要删除的前一个地址,删除的时候需要
    }
    if(ok)
        return 1;///删除成功返回1
    else
        return 0;///删除失败返回0
}


///删除链表的值
int del_val(linklist *L,int n)
{
    int ok=0;
    linklist *p,*q;
    p=L;q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///删除失败返回0
    }
    while(q->next!=NULL)
    {
        q=q->next;///该删除值的方法与删除节点的方法一样,就不再重复解释了
        if(q->data==n)
        {
            p->next=q->next;
            free(q);
            q=p;
            ok=1;
            break;
        }
        p=q;
    }
    if(ok)
        return 1;///删除成功返回1
    else
        return 0;///删除失败返回0
}


///插入节点的值
int insert_loc(linklist *L,int loc,int n)
{
    int position=0,flag=0;
    linklist *p,*temp;
    temp=(linklist *)malloc(sizeof(linklist));
    temp->data=n;
    p=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///插入失败返回0
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(position==loc-1)///插入的值是loc,我们查找到loc的前一个就够了
        {
            flag=1;
            break;
        }
    }
    temp->next=p->next;///p是loc-1的位置,p->next的位置就是loc了,让temp的next指向loc,那么temp的位置也就变成loc的位置了
    p->next=temp;///p->next就是loc指向temp,也就是插入成功了,temp的位置变成loc的位置了
    if(flag)
        return 1;///插入成功返回1
    else
        return 0;///插入失败返回0
}




///插入值的节点
int insert_val(linklist *L,int m,int n)
{
    int loc=0,position=0,flag=0;
    linklist *p,*q,*temp;
    temp=(linklist *)malloc(sizeof(linklist));
    q=(linklist *)malloc(sizeof(linklist));
    temp->data=n;
    p=L;
    q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///插入失败返回0
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++loc;
        if(p->data==m)
        {
            flag=1;
            break;
        }
    }
    while(q->next!=NULL)
    {
        q=q->next;
        ++position;
        if(position==loc-1)
            break;
    }
    temp->next=q->next;
    q->next=temp;
    if(flag)
        return 1;
    else
        return 0;
}


///清屏
void clear()
{
    printf("\n请按任意键技继续......");
    getch();
    system("cls");
}
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int elemtype;///定义类型,下次修改可以直接在这里修改
typedef struct node
{
    elemtype data;///数据域
    struct node *next;///指针域
}linklist;


linklist *initLinkList();///初始化链表


void creatLinkList(linklist *);///创建链表


void displayLinkList(linklist *);///输出链表


linklist *search_loc(linklist *,int );///查找链表的节点


void search_val(linklist *,elemtype ,int *);///查找链表的值


int del_loc(linklist *,int );///删除链表的节点


int del_val(linklist *,elemtype );///删除链表的值


int insert_loc(linklist *,int ,elemtype );///插入节点的值


int insert_val(linklist *,elemtype ,elemtype );///出入值的节点


void clear();///清屏


int main()
{
    int choice,loc,ok;
    elemtype m,n;
    linklist *L,*temp;///L是头结点,temp是接下来用来存地址使用的
    do{
        printf("\t\t\t*************************\n");
        printf("\t\t\t*1.初始化链表\t\t*\n");
        printf("\t\t\t*2.创建链表    \t\t*\n");
        printf("\t\t\t*3.输出链表    \t\t*\n");
        printf("\t\t\t*4.查找链表节点\t\t*\n");
        printf("\t\t\t*5.查找链表的值\t\t*\n");
        printf("\t\t\t*6.删除链表的节点\t*\n");
        printf("\t\t\t*7.删除链表的值的节点   *\n");
        printf("\t\t\t*8.插入链表的节点的值   *\n");
        printf("\t\t\t*9.插入链表的节点的值   *\n");
        printf("\t\t\t*0.退出      \t\t*\n");
        printf("\t\t\t*************************\n");
        printf("请输入你需要的操作数:");
        scanf("%d",&choice);
        if(choice==0)
            break;
        switch(choice)
        {
            case 1: L=initLinkList();break;///初始化链表之后得把地址赋值给L
            case 2: creatLinkList(L);break;
            case 3: displayLinkList(L);break;
            case 4: printf("请输入你需要查找的节点位置:");
                    scanf("%d",&loc);
                    temp=search_loc(L,loc);///查找到节点之后返回地址赋值给temp
                    if(temp==NULL)
                        printf("NULL\n");
                    else
                        printf("%p",temp);///%p是输出计算机的地址
                    break;
            case 5: loc=0;///初始化loc,如果没有查找到节点loc是0
                    printf("请输入你需要的查找的数值:");
                    scanf("%d",&n);
                    search_val(L,n,&loc);///loc传地址,在函数查找到后传回地址
                    if(loc==0)
                        printf("NULL");
                    else
                        printf("该数值在%d的位置\n",loc);
                    break;
            case 6: printf("请输入你需要删除的节点位置:");
                    scanf("%d",&loc);
                    ok=del_loc(L,loc);
                    if(ok)
                        printf("删除成功\n");
                    else
                        printf("删除失败\n");
                    break;
            case 7: printf("请输入你需要删除的值:");
                    scanf("%d",&n);
                    ok=del_val(L,n);
                    if(ok)
                        printf("删除成功\n");
                    else
                        printf("删除失败\n");
                    break;
            case 8: printf("请输入你要插入的位置:");
                    scanf("%d",&loc);
                    printf("请输入你要插入的值:");
                    scanf("%d",&n);
                    ok=insert_loc(L,loc,n);
                    if(ok)
                        printf("插入成功\n");
                    else
                        printf("插入失败\n");
                    break;
            case 9: printf("请输入你需要插入在某值的前面的值:");
                    scanf("%d",&m);
                    printf("请输入你需要插入的值:");
                    scanf("%d",&n);
                    ok=insert_val(L,m,n);
                    if(ok)
                        printf("插入成功\n");
                    else
                        printf("插入失败\n");
                    break;
            default:printf("输入错误,请重新输入\n");break;
        }
        clear();
    }while(1);


    return 0;
}


///初始化链表
linklist *initLinkList()
{
    linklist *L;
    L=(linklist *)malloc(sizeof(linklist));
    if(!L)
        printf("初始化失败\n");
    else
        printf("初始化成功\n");
    L->next=NULL;
    return L;///初始化完返回地址
}


///创建链表
void creatLinkList(linklist *L)
{
    linklist *p,*q,*temp;
    int num,data;
    temp=L;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    ///采取的是尾插法,再次进入的时候的尾插的头节点应该是链表的最后一个节点,继续插入
    p=temp;///未插入数据之前,头节点就是上一次链表的头节点
    printf("\t\t\t请输入你需要的添加数量:");
    scanf("%d",&num);
    printf("\t\t\t请输入%d个数据:",num);
    while(num--)
    {
        scanf("%d",&data);
        q=(linklist *)malloc(sizeof(linklist));
        q->data=data;
        q->next=p->next;
        p->next=q;
        p=q;
    }
}




///输出链表
void displayLinkList(linklist *L)
{
    linklist *p;
    p=L;
    printf("\t\t\t以下是链表的数据:");
    if(!p->next)///链表如果是空的应该立马输出空的,并返回
    {
        printf("NULL\n");
        return ;
    }
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d ",p->data);
    }
    printf("\n");
}


///查找链表的节点
linklist *search_loc(linklist *L,int loc)
{
    int position=0;
    linklist *p;
    p=L;
    if(!p->next)
    {
        ///链表为空的,输出NULL
        return NULL;///返回空地址
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(position==loc)///查找到节点并跳出
            break;
    }
    if(position==loc)
        return p;
    else
        return NULL;///查找不到返回空
}




///查找链表的值
void search_val(linklist *L,int n,int *loc)
{
    int position=0;
    linklist *p;
    p=L;
    if(!p->next)
    {
        ///链表为空的,输出NULL
        return ;///并返回
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(p->data==n)
            *loc=position;///loc是指针,只要让loc指向position的地址,返回的时候就可以改变loc的值
    }
    return ;
}


///删除链表的节点
int del_loc(linklist *L,int loc)
{
    int position=0,ok=0;
    linklist *p,*q;
    p=L;q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///删除失败返回0
    }
    while(q->next!=NULL)
    {
        q=q->next;///用q来查找需要删除的值
        ++position;
        if(position==loc)
        {
            p->next=q->next;///p是要删除的前一个,那只要它的next指向要删除的下一个地址就跳过了要删除的值
            free(q);///释放空间
            q=p;///释放完q得指向p,那样p的next也就是q的next,让q的链表正常,也就让L的链表连接正常
            ok=1;///删除成功
            break;
        }
        p=q;///这样一直循环就是p永远是要删除的前一个地址,删除的时候需要
    }
    if(ok)
        return 1;///删除成功返回1
    else
        return 0;///删除失败返回0
}


///删除链表的值
int del_val(linklist *L,int n)
{
    int ok=0;
    linklist *p,*q;
    p=L;q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///删除失败返回0
    }
    while(q->next!=NULL)
    {
        q=q->next;///该删除值的方法与删除节点的方法一样,就不再重复解释了
        if(q->data==n)
        {
            p->next=q->next;
            free(q);
            q=p;
            ok=1;
            break;
        }
        p=q;
    }
    if(ok)
        return 1;///删除成功返回1
    else
        return 0;///删除失败返回0
}


///插入节点的值
int insert_loc(linklist *L,int loc,int n)
{
    int position=0,flag=0;
    linklist *p,*temp;
    temp=(linklist *)malloc(sizeof(linklist));
    temp->data=n;
    p=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///插入失败返回0
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++position;
        if(position==loc-1)///插入的值是loc,我们查找到loc的前一个就够了
        {
            flag=1;
            break;
        }
    }
    temp->next=p->next;///p是loc-1的位置,p->next的位置就是loc了,让temp的next指向loc,那么temp的位置也就变成loc的位置了
    p->next=temp;///p->next就是loc指向temp,也就是插入成功了,temp的位置变成loc的位置了
    if(flag)
        return 1;///插入成功返回1
    else
        return 0;///插入失败返回0
}




///插入值的节点
int insert_val(linklist *L,int m,int n)
{
    int loc=0,position=0,flag=0;
    linklist *p,*q,*temp;
    temp=(linklist *)malloc(sizeof(linklist));
    q=(linklist *)malloc(sizeof(linklist));
    temp->data=n;
    p=L;
    q=L;
    if(!p->next)
    {
        printf("NULL\n");///链表为空的,输出NULL
        return 0;///插入失败返回0
    }
    while(p->next!=NULL)
    {
        p=p->next;
        ++loc;
        if(p->data==m)
        {
            flag=1;
            break;
        }
    }
    while(q->next!=NULL)
    {
        q=q->next;
        ++position;
        if(position==loc-1)
            break;
    }
    temp->next=q->next;
    q->next=temp;
    if(flag)
        return 1;
    else
        return 0;
}


///清屏
void clear()
{
    printf("\n请按任意键技继续......");
    getch();
    system("cls");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值