链表的创建,倒置,查询,插入操作

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

typedef struct node {
    int data;
    struct node *next;
}linknode,*linkp;

int CreateList(linkp H); //创建链表,并返回链表中数值个数
void InversionList(linkp H); //将已经创建并赋值的链表进行倒置
linkp GetList(linkp H,int i);//按照序号进行查找(链表头结点序号为0)
linkp LocateList(linkp H,int data); //按照数值进行查找,结果返回查到的输入数值在链表中的序号
void InsertList(linkp H, int num, int i); //将数值num插入首节点为H的链表的第i位置(链表头结点序号为0)


int main()
{
    linkp findpNo,findpNum,r,H;
    int i = 0;   
    int no = 0; //输入的待查询的序号
    int findno = 0;//输入的待查询的数值
    int count = 0;//链表中包含数值个数
    int insertnum = 0;//向链表中插入的数值
    int insertno = 0;//将需要插入的数值插到链表的序号
    H = (linkp)malloc(sizeof(linknode));
    H->next = NULL;
    count =CreateList(H); //创建链表并赋值
    if(count==0)
    {   
        printf("该链表只有头结点,不包含任何数据!\n");
        return -1; 
    }   
    r = H;
    printf("\n#####步骤1:链表倒置前序列值#####\n");
    while(r->next)
    {   
        r = r->next;
        printf("链表第%d个数字是%d\n", ++i, r->data);
    }   
    
    printf("\n#####步骤2:链表倒置后序列值#####\n");
    InversionList(H); //将链表进行倒置
    r = H;
    i = 0;
    while(r->next)
    {   
        r = r->next;
        printf("链表第%d个数字是%d\n", ++i, r->data);
    }

    printf("\n#####步骤3:通过序号查找链表的数值#####\n");
    /**按照序号查找链表的某个节点**/
    while(1)
    {
        printf("请输入需要查找的序号(链表头结点序号为0,输入-1不再查询):");
        scanf("%d", &no);
        if(no==-1)
            break;
        if(no>count)
        {
            printf("序号范围[0~%d],请重新输入序号!\n", count);
            continue;
        }
        findpNo = GetList(H, no);
        if(findpNo==H)
        {
            printf("链表头结点无数值!\n");
            continue;
        }
        printf("链表序号[%d]所对应数值是:[%d]\n", no, findpNo->data);

    }

    /**通过数值查找链表的某个节点**/
    printf("\n#####步骤4:通过数值查找其在链表的位置#####\n");
    while(1)
    {
        printf("请输入需要查找的数值(链表头结点序号为0,输入-1不再查询):");
        scanf("%d", &findno);
        if(findno==-1)
            break;
        findpNum = LocateList(H,findno);
        if(findpNum == NULL)
        {
            printf("输入的数值不在所查链表中!\n");
        }
        else
        {
            r = H;
            i = 0;
            while(r->next)
            {
                i++;
                r = r->next;
                if(r==findpNum)
                {
                    printf("链表中数值[%d]所对应序号是[%d]\n", findno, i);
                    break;
                }
            }

        }

    }

    /**向列表中插入数据,并打印插入数据后的链表数据序列**/

    printf("\n#####步骤5:通过输入的数值和序号将数值插入到链表的指定位置#####\n");
    while(1)
    {
        printf("请输入向链表中插入的数值以及序号(usage:insertnum inserno;注:两者同为-1,则停止插入数据):");
        scanf("%d,%d", &insertnum,&insertno);
        if(insertnum==-1 && insertno==-1)
            break;
        if(insertno>count)
        {
            printf("插入范围是1~%d,请重新输入!\n", count);
            continue;
        }


        InsertList(H, insertnum, insertno);
        count++;
        r = H;
        i = 0;
        while(r->next)
        {
            r = r->next;
            printf("链表第%d个数字是%d\n", ++i, r->data);
        }

    }
    return 0;
}

int CreateList(linkp H)
{
    linkp r,p;
    int num = -1;
    int count = 0;
    r = H;

    while( 1 )
    {
        printf("请输入存入链表中的数字\n");
        scanf("%d", &num);
        if ( -1 == num )
        {
            break;
        }
        count++;
        linkp p = (linkp)malloc(sizeof(linknode));
        p->data = num;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    return count;
}

void InversionList(linkp H)
{
    linkp p,q;
    p = H->next; //p指向头结点下一个节点
    H->next = NULL; //将头结点与其下一个节点断开连接,此时p节点成为链表的第一个节点
    while(p)
    {
        q = p; //保存链表余下节点的头一个节点
        p = p->next; //将p节点向后移
        q->next = H->next; //将链表余下节点的第一个节点插入到原链表头结点与其指向节点(NULL)中间
        H->next = q;//将H指向将要插入的节点

    }

}

linkp GetList(linkp H,int i)
{
    int j = 0;
    linkp r;
    r = H;
    if(i<0) //判断序号是否合法
    {
        printf("输入序号有误!");
        return NULL;
    }
    else if(i==0)
        return H;
    else
    {
        while(r->next)
        {
            j++;
            r=r->next;
            if(j==i)
            {
                return r;
            }
        }
    }
}

linkp LocateList(linkp H, int num)
{
    linkp r;
    int i = 0;
    r = H;
    while(r->next)
    {
        i++;
        r = r->next;
        if(r->data==num)
            return r;
    }
    return NULL;

}


void InsertList(linkp H, int num, int i)
{
    linkp p,new;
    new = (linkp)malloc(sizeof(linknode));
    new->data = num;
    p = GetList(H,i-1);
    new->next = p->next;
    p->next = new;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值