| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 437 人关注过本帖
标题:刚才发的咋回事啊!看不到居然!再发一下
只看楼主 加入收藏
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
刚才发的咋回事啊!看不到居然!再发一下
先建立一若干结点(结点数据域的值由键盘输入)构成的单链表,再实现下列操作:(每一功能用一函数实现)
11·
从链表的第i个结点开始连删len个结点,若不够个len结点,则从第i个结点开始删到表尾。
22·
在第i个结点之后插入一值为x的结点,并返回成功与否的标志。
以上是题目要求!
以下是我的代码:
程序代码:
[color=#0000FF]#include<stdio.h>
#include<stdlib.h>
#define N  5  /*控制结点数*/
struct stu
{
    int num;/*学号*/
    struct stu *next;
}stu[N];
void main()
{
    struct stu *head;/*结点声明*/
    struct stu *creat(struct stu *head);/*函数声明建立链表*/
    struct stu *delet(struct stu *head,int i,int len);/*函数声明在i结点开始连删len个结点*/
    struct stu *input(struct stu *head,int i,int x);/*函数声明在第i个结点后插入值为x的节点*/
    void print(struct stu *head);/*函数声明输出链表数据*/
    int i,len,x;
        printf("请输入相关数据:\n");
    while(1)
    {
        printf("请输入i和len:\n");
        scanf("%d%d",&i,&len);
        if(i>0&&len>0&&i<=N)
            break;
        else
            continue;
    }
    printf("请输入要插入的结点数据x:\n");
        scanf("%d",&x);
    head=creat(head);/*函数掉用建立链表*/
    print(head);/*函数调用输出初始链表*/
    head=delet(head,i,len);/*函数调用输出删除len个结点后的链表*/
    print(head);/*输出删除len个结点后的链表*/
    head=input(head,i,x);/*函数调用输出链表*/
    print(head);/*函数调用输出插入x结点后的链表*/
}
/*-------------函数定义建立链表------------*/
struct stu *creat(struct stu *head)

 {
     struct stu *thisp,*newp;
    head=NULL;/*置空表*/
    int i;
    printf("输入四个学生的信息:\n");/*建立链表*/
    for(i=0;i<N;i++)
    {
        newp=(struct stu *)malloc(sizeof(stu));
        if(head==NULL)
            head=newp;
        else
        {
            thisp=head;
            while(thisp->next!=NULL)
                thisp=thisp->next;
            thisp->next=newp;/*指向新开辟的节点*/
        }
        thisp=newp;
        printf("学号为%d的学生的信息\n",i+1);
                printf("学号:\n");
        scanf("%d",&thisp->num);
        thisp->next=NULL;
    }
    return head;

 }
/*-----------函数定义删除题目要求的结点---------*/
struct stu *delet(struct stu *head,int i,int len)
{
    struct stu *pointer,*ward,*back;/*结点声明*/
    pointer=head;/*设为头结点*/
    int j,count=0;/*count为计数器记录删除的结点个数*/

        while(j=0;j<i;j++)/*此循环为找到开始删除的那个结点*/
        {
            back=pointer;/*pointer结点的前一结点*/
            pointer=pointer->next;
        }
        ward=pointer->next;/*从ward结点开始删除*/
        if(ward->next==NULL)/*如果back结点是最后一个结点*/
        {
            pointer->next=NULL;/*上一个结点设为尾结点*/
            free(ward);/*释放back结点*/
        }
        else if(pointer->next=NULL)/*如果要从最后一个结点开始删*/
        {
            back->next=NULL;/*上一节点为尾结点*/
            free(pointer);
        }
        else
        {
           
                if(N-i<=len)/*如果从第i个结点开始计算剩余的结点数目小于len*/
                {
                    pointer->next=NULL;
                    while(ward->next!=NULL)/*释放后面的结点*/
                    {
                        ward=ward->next;
                        free(ward);
                    }
                    free(ward);/*释放最后一个结点*/
                }
                else
                {
                    while(1)
                    {
                           ward=ward->next;
                          free(ward);
                          count++;
                          if(len==count)/*当按要求删完后*/
                          {
                             pointer->next=back;
                             break;
                          }
                    }
                }
       
        }
        return head;

}
/*-------------函数定义插入结点------------*/
struct stu *input(struct stu *head,int i,int x)
{
   
    struct stu *pointer,*back,*ward,*nextd;/*结点声明*/
    int j;
    ward=(struct stu *)malloc(sizeof(stu));/*开辟新结点*/
    ward->num=x;/*把x赋值给新开辟的结点*/
    while(j=0;j<i;j++)  /*找到要插入的前一位置*/
    {
        back=pointer;
        pointer=pointer->next;
    }
    if(pointer->next=NULL)/*插在表尾*/
    {
        pointer->next=ward;
        ward->next=NULL;
    }
    else/*插在pointer和nextd结点之间*/
    {
        nextd=pointer->next;
        ward->next=nextd;
        pointer->next=ward;
    }
    return head;
}
/*---------------输出链表---------------*/
void print(struct stu *head)
{
    struct stu *pointer;/*结点声明*/
    pointer=head;/*设为头结点*/
    while(pointer!=NULL)
    {
        printf("%d",pointer->num);
        pointer=pointer->next;
        printf("\n");
    }
}
    

    


         另外这个程序没有实现那个要求插入的那个返回成功的标志:希望谁给完善一下!不胜感激      
       
            



   
[/color]
搜索更多相关主题的帖子: 看不到 
2010-07-06 21:26
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
--------------------Configuration: 函数链表 - Win32 Debug--------------------
Compiling...
函数链表.cpp
F:\c\函数链表.cpp(70) : error C2143: syntax error : missing ')' before ';'
F:\c\函数链表.cpp(70) : warning C4552: '<' : operator has no effect; expected operator with side-effect
F:\c\函数链表.cpp(70) : error C2059: syntax error : ')'
F:\c\函数链表.cpp(71) : error C2143: syntax error : missing ';' before '{'
F:\c\函数链表.cpp(126) : error C2143: syntax error : missing ')' before ';'
F:\c\函数链表.cpp(126) : warning C4552: '<' : operator has no effect; expected operator with side-effect
F:\c\函数链表.cpp(126) : error C2059: syntax error : ')'
F:\c\函数链表.cpp(127) : error C2143: syntax error : missing ';' before '{'
执行 cl.exe 时出错.

函数链表.obj - 1 error(s), 0 warning(s)
这是让 我头疼的报错!我都郁闷了
2010-07-06 21:27
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
不好意思!这次忘了加多点分了!下次 补上!还有就是那个删除和插入的函数调用顺序不同结果也不同啊!不知道咋个解决!谢谢
2010-07-06 21:29
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:20 
遮天云,怎么又有问题了,上次不是改过了吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-10 15:42
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
你把while当成for用了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-10 15:44
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define N  5  /*控制结点数*/
struct stu
{
    int num;/*学号*/
    struct stu *next;
}stu[N];
void main()
{
    struct stu *head;/*结点声明*/
    struct stu *creat(struct stu *head);/*函数声明建立链表*/
    struct stu *delet(struct stu *head,int i,int len);/*函数声明在i结点开始连删len个结点*/
    struct stu *input(struct stu *head,int i,int x);/*函数声明在第i个结点后插入值为x的节点*/
    void print(struct stu *head);/*函数声明输出链表数据*/
    int i,len,x;
        printf("请输入相关数据:\n");
    while(1)
    {
        printf("请输入i和len:\n");
        scanf("%d%d",&i,&len);
        if(i>0&&len>0&&i<=N)
            break;
        else
            continue;
    }
    printf("请输入要插入的结点数据x:\n");
        scanf("%d",&x);
    head=creat(head);/*函数掉用建立链表*/
    print(head);/*函数调用输出初始链表*/
    head=delet(head,i,len);/*函数调用输出删除len个结点后的链表*/
    print(head);/*输出删除len个结点后的链表*/
    head=input(head,i,x);/*函数调用输出链表*/
    print(head);/*函数调用输出插入x结点后的链表*/
}
/*-------------函数定义建立链表------------*/
struct stu *creat(struct stu *head)
{
     struct stu *thisp,*newp;
    head=NULL;/*置空表*/
    int i;
    printf("输入四个学生的信息:\n");/*建立链表*/
    for(i=0;i<N;i++)
    {
        newp=(struct stu *)malloc(sizeof(stu));
        if(head==NULL)
            head=newp;
        else
        {
            thisp=head;
            while(thisp->next!=NULL)
                thisp=thisp->next;
            thisp->next=newp;/*指向新开辟的节点*/
        }
        thisp=newp;
        printf("学号为%d的学生的信息\n",i+1);
                printf("学号:\n");
        scanf("%d",&thisp->num);
        thisp->next=NULL;
    }
    return head;
}
/*-----------函数定义删除题目要求的结点---------*/
struct stu *delet(struct stu *head,int i,int len)
{
    struct stu *pointer,*ward,*back;/*结点声明*/
    pointer=head;/*设为头结点*/
    int j,count=0;/*count为计数器记录删除的结点个数*/

        for(j=0;j<i;j++)/*此循环为找到开始删除的那个结点*/
        {
            back=pointer;/*pointer结点的前一结点*/
            pointer=pointer->next;
        }
        ward=pointer->next;/*从ward结点开始删除*/
        if(ward->next==NULL)/*如果back结点是最后一个结点*/
        {
            pointer->next=NULL;/*上一个结点设为尾结点*/
            free(ward);/*释放back结点*/
        }
        else if(pointer->next=NULL)/*如果要从最后一个结点开始删*/
        {
            back->next=NULL;/*上一节点为尾结点*/
            free(pointer);
        }
        else
        {       if(N-i<=len)/*如果从第i个结点开始计算剩余的结点数目小于len*/
                {
                    pointer->next=NULL;
                    while(ward->next!=NULL)/*释放后面的结点*/
                    {
                        ward=ward->next;
                        free(ward);
                    }
                    free(ward);/*释放最后一个结点*/
                }
                else
                {
                    while(1)
                    {
                           ward=ward->next;
                          free(ward);
                          count++;
                          if(len==count)/*当按要求删完后*/
                          {
                             pointer->next=back;
                             break;
                          }
                    }
                }
      
        }
        return head;

}
/*-------------函数定义插入结点------------*/
struct stu *input(struct stu *head,int i,int x)
{
  
    struct stu *pointer,*back,*ward,*nextd;/*结点声明*/
    int j;
    ward=(struct stu *)malloc(sizeof(stu));/*开辟新结点*/
    ward->num=x;/*把x赋值给新开辟的结点*/
    for(j=0;j<i;j++)  /*找到要插入的前一位置*/
    {
        back=pointer;
        pointer=pointer->next;
    }
    if(pointer->next=NULL)/*插在表尾*/
    {
        pointer->next=ward;
        ward->next=NULL;
    }
    else/*插在pointer和nextd结点之间*/
    {
        nextd=pointer->next;
        ward->next=nextd;
        pointer->next=ward;
    }
    return head;
}
/*---------------输出链表---------------*/
void print(struct stu *head)
{
    struct stu *pointer;/*结点声明*/
    pointer=head;/*设为头结点*/
    while(pointer!=NULL)
    {
        printf("%d",pointer->num);
        pointer=pointer->next;
        printf("\n");
    }
}
    
可以了,你试试看,是不是你要的结果

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-10 15:46
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
不是发短消息或回复我哦

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-10 15:48
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
不是啊!我这个帖子是上次和那个一块发上去的,上次发那个时突然显示未知错误!我也打不开那个帖子了!就有发了一次!我以为这个被当做分贴处理了呢!
2010-07-10 17:15
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
哦,原来是这样啊,你 把while循环当for用了,我汗

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-10 17:22
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
回复 9楼 sunyh1999
嘿嘿!当时硬是没发现啊
2010-07-11 07:09
快速回复:刚才发的咋回事啊!看不到居然!再发一下
数据加载中...
 
   



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

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