| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1742 人关注过本帖
标题:无头结点单链表删除结点问题
只看楼主 加入收藏
木头lbj
Rank: 7Rank: 7Rank: 7
来 自:黄山
等 级:黑侠
威 望:1
帖 子:269
专家分:527
注 册:2010-11-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
无头结点单链表删除结点问题
要实现删除一个没有头结点的单链表中删除第i个之后的连续k个结点,下面是我写的代码,头一次接触数据结构,好像在用键盘输入创建单链表的地方很乱,劳烦大家看看,给我指指问题吧,我将感激不尽啊
#include <stdio.h>
#include <malloc.h>
typedef struct lianbiao
{
int data;
struct lianbiao * next;
}lianbiao, *list;

//建立链表
list creatlist(list p)
{
int temp;
list q;

printf("请输入结点的值(以0结束):");
fflush(stdin);
scanf("%d",&temp);
while (temp != 0)
if(temp >0 && temp <9999)
{
q = (list)malloc(sizeof(lianbiao)); //生成新的结点
q -> data = temp;
q -> next = p -> next;
p -> next =q;
}
printf("请输入结点的值(以0结束)");
fflush(stdin);
scanf("%d",&temp);
return p;
}
//删除从第i个结点开始的连续k个结点

int del(int i,int k)
{
list p,q;
int j,n;
q = p -> next;
for(j = 1;j < i;j ++)
{
if(p)
{
p = p -> next;
q = q -> next;
}
else break;
}
for (n = 0;n <= k;n ++)
{
p -> next = q -> next;
free(q);
p -> next = q;
}
return 0;
}

//输出链表
void print(list p)
{
//list p;
int i = 0;
while (p != NULL)
{
i ++;
printf("第%d个元素是:",i);
printf("%d\n",p -> data);
p = p -> next;
}
}

void main()
{
list p;
p = (list)malloc(sizeof(lianbiao));
creatlist(p);
print(p);
del(1,5);//第1个结点开始的连续5个结点
print(p);
}
搜索更多相关主题的帖子: 键盘 
2011-03-15 21:04
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
程序代码:
/*无头结点单链表删除结点问题
要实现删除一个没有头结点的单链表中删除第i个之后的连续k个结点,下面是我写的代码,头一次接触数据结构,
好像在用键盘输入创建单链表的地方很乱,劳烦大家看看,给我指指问题吧,我将感激不尽啊
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct lianbiao
{
    int data;
    struct lianbiao * next;
}lianbiao, *list;

//建立链表
list creatlist(list p)
{
    int temp;
    list q;

    printf("请输入结点的值(以0结束):");
    fflush(stdin);
    scanf("%d",&temp);
    while (temp != 0)
    {
        if(temp >0 && temp <9999)
        {
            q = (list)malloc(sizeof(lianbiao)); //生成新的结点
            q -> data = temp;
            q -> next = p -> next;
            p -> next =q;
        }
        printf("请输入结点的值(以0结束)");
        fflush(stdin);
        scanf("%d",&temp);
    }

    return p;
}
//删除从第i个结点开始的连续k个结点
list del(int i, int k, list p)
{
    list temp = p;
    while( i>0 && temp != NULL )
    {
        --i;
        temp = temp->next;
    }
    if( 0 < i )
    {
        printf("\t\t没有足够的结点信息 请确认\n");
        exit(0);
    }
    list etemp = temp->next;
    while( k>0 && etemp != NULL )
    {
        --k;
        etemp = etemp->next;
    }
    if( 0 < k )
    {
        printf("\t\t没有足够的结点信息 请确认\n");
        exit(0);
    }
    temp->next = etemp;

    return p;
}

//输出链表
void print(list p)
{
    //list p;
    int i = 0;
    p = p->next;
    while (p != NULL)
    {
        i ++;
        printf("第%d个元素是:",i);
        printf("%d\n",p -> data);
        p = p -> next;
    }
}

void main()
{
    list p;
    p = (list)malloc(sizeof(lianbiao));
    p->next = NULL;

    p = creatlist(p);

    print(p);

    del(1,5, p);//第1个结点开始的连续5个结点

    print(p);
}
2011-03-15 21:52
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
你的原代码 有很多的不足的地方
虽然 说是无头结点单链表 但是在createlist函数当中 是 带有头结点的  
还有事 这里不是引用类型 所以要有返回值 不然 改变后的结果是无法返回到
调用函数(主函数)当中的 当然也可以用二级地址的方法 得到同样的效果
(自己斟酌吧:->)
2011-03-15 21:56
木头lbj
Rank: 7Rank: 7Rank: 7
来 自:黄山
等 级:黑侠
威 望:1
帖 子:269
专家分:527
注 册:2010-11-6
收藏
得分:0 
回复 2楼 寒风中的细雨
谢谢啊。。。我的C语言当初没学好,现在学起数据结构实现起来吃力了。。。
我会努力的。。。
bccn太好了。。。
再次感谢啊。。。

。。。!!!)))000
2011-03-15 22:11
快速回复:无头结点单链表删除结点问题
数据加载中...
 
   



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

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