| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 575 人关注过本帖
标题:初学数据结构-C语言-链表的创建及相关操作
只看楼主 加入收藏
zxh2013
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-4-2
收藏
 问题点数:0 回复次数:4 
初学数据结构-C语言-链表的创建及相关操作
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>

typedef struct LinkList
{
    struct LinkList * pNext;
    int data;
} LList, * pLL;

pLL Create_LList()
{
    int SIZE;
    int VAL;//临时存放用户输入的节点值

    pLL pHead = (pLL)malloc(sizeof(LList));
    if(pHead==NULL)//注意与(pHead->pNext==NULL)的区别
    {
        printf("创建失败,程序终止!\n");
        exit(-1);
    }

    pLL pTail = pHead;
    pTail->pNext = NULL;

    printf("请输入链表节点个数:");
    scanf("%d",&SIZE);

    for(int i=0;i<SIZE;i++)
    {
        printf("\n请输入第%d个节点的值:",i+1);
        scanf("%d",&VAL);

        pLL pNew = (pLL)malloc(sizeof(LList));
        if(pNew==NULL)
        {
            printf("创建失败,程序终止!\n");
            exit(-1);
        }

        pNew->data = VAL;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    return pHead;
}

bool Is_Empty(pLL pHead)
{
    if(pHead->pNext == NULL)
        return true;
    else
        return false;
}

int Size_LList(pLL pHead)
{
    pLL p = pHead->pNext;
    int size=0;
    while(p!=NULL)
    {
        size++;
        p=p->pNext;
    }
    return size;
}

bool Insert_LList(pLL pHead, int val, int pos)
{
    int i=0;
    pLL p = pHead;
    while(p != NULL && i<pos-1)
    {
        p=p->pNext;
        i++;
    }
    if(p==NULL || i>pos-1)
    return false;

    pLL pNew=(pLL)malloc(sizeof(LList));
    if(pNew==NULL)
        {
            printf("创建失败,程序终止!");
            exit(-1);
        }
    pNew->data=val;
    pLL q = p->pNext;
    p->pNext=pNew;
    pNew->pNext=q;
    pNew=q;
    return true;
}

bool Delete_LList(pLL pHead, int pos, int * pval)
{
    int i=0;
    pLL p = pHead;
    while(p->pNext != NULL && i<pos-1)
    {
        p=p->pNext;
        i++;
    }
    if(p->pNext==NULL || i>pos-1)
    return false;

    pLL    q=p->pNext;
    * pval=q->data;
   
    p->pNext=p->pNext->pNext;
    free(q);
    q=NULL;
    return true;
}


void Sort_LList(pLL pHead)
{
    int i,j,t;
    int size=Size_LList(pHead);
    pLL p,q;
    for(i=0, p=pHead->pNext;i<size-1;i++, p=p->pNext)
        for(j=i+1, q=p->pNext;j<size;j++, q=q->pNext)
        {
            if(p->data>q->data)
            {
                t=p->data;
                p->data=q->data;
                q->data=t;
            }
        }
        return;
}

bool Find_LList(pLL pHead, int val, int *pos)
{
    pLL p=pHead->pNext;
    int size=0;
    for(p;p!=NULL;)
    {
        if(p->data==val)
        {
            *pos=size+1;
            return true;
        }
        
         size++;
         p=p->pNext;
    }
    if(p==NULL)
    {
        return 0;
    }
}

void Traverse_LList(pLL pHead)
{
    pLL p=pHead->pNext;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->pNext;
    }
    printf("\n");
}

int main()
{
    pLL Head=NULL;
    int size;
    int pos,val;
    Head=Create_LList();
    if(Is_Empty(Head))
    {
        printf("\n链表为空,程序终止!\n");
        exit(-1);
    }
    printf("\n创建的链表为:");
    Traverse_LList(Head);
    size = Size_LList(Head);
    Sort_LList(Head);
    printf("\n链表顺序排列为:");
    Traverse_LList(Head);
    printf("\n请输入要插入节点的值和位置:");
    scanf("%d %d", &val, &pos);
    if(Insert_LList(Head,val,pos))
    {
        printf("\n在第%d个位置插入%d后链表为:", pos, val);
        Traverse_LList(Head);
    }
    else
        printf("\n插入失败!\n");
    printf("\n请输入要删除节点的位置:");
    scanf("%d", &pos);
    if(Delete_LList(Head, pos, &val))
    {
        printf("\n删除值为%d的节点后链表为:", val);
        Traverse_LList(Head);
    }
    else
        printf("\n删除失败!\n");
    printf("\n请输入要查找节点的值:");
    scanf("%d", &val);
    if(Find_LList(Head, val, &pos))
    printf("\n%d所在节点在第%d个位置\n", val, pos);
    else
        printf("\n没有找到值为%d的节点!\n", val);

   
    return 0;
}
搜索更多相关主题的帖子: 结构 include C语言 用户 
2013-04-02 19:13
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
科普?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-02 19:15
yctchxf
Rank: 6Rank: 6
来 自:盐城
等 级:侠之大者
威 望:2
帖 子:176
专家分:454
注 册:2012-4-10
收藏
得分:0 
你干嘛? 什么问题啊?
2013-04-02 23:22
YJ_Hao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:215
专家分:609
注 册:2013-3-22
收藏
得分:0 
我是初学,有学习的价值
2013-04-03 06:52
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 
呵呵,你觉得你懂了,可以试着优化一下。或者实践一下。
程序代码:
问题描述 

有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N。一只松鼠从最下果子开始向上跳,并且第i次跳可以一次跳过i*i*i除以5的余数+1个果子(=i*i*i%5+1),并把脚下的果子吃了,如果上面有果子,在重力作用下,都将向下掉下一格。如第1次跳从第一个果子上跳过1*1*1%5+1=2个果子,可跳到第3个果子上,并把第3个果子吃了;第2次从第4个果子上(落在原来第三个果子位置)跳过2*2*2%5+1=4个到第8个果子上,并把第8个吃了;如此...。
  当然,总有一次松鼠会跳出这串果子的最前面,设为每K次,它吃不到任何果子了。这时它回到最下面的果子上,重做它的第K次跳,以求吃到果子。如此,问它吃的第m只果子(即第M跳吃到的果子)的标号是什么?

输入 

一共两行,分别为N和m。(1<=m<=n<=200,并且满足能够跳到第m次) 



输出 

共1行一个数,即它吃的第m只果子的标号。 



输入样例 


10
4



输出样例 


9


从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2013-04-03 07:08
快速回复:初学数据结构-C语言-链表的创建及相关操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025383 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved