| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 540 人关注过本帖
标题:写的静态链表在插入后输出陷入死循环,但是在未插入前输出不会,不知道哪里 ...
只看楼主 加入收藏
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
写的静态链表在插入后输出陷入死循环,但是在未插入前输出不会,不知道哪里错了,大家给看看帮帮忙
程序代码:
#include<stdio.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct node
{
    datatype data;
    int link;

}snode;
typedef struct
{
    snode nodes[MAXSIZE];
    int newptr;
}slinklist;

slinklist a;

void initlist(slinklist *sl)   //初始化
{
    int i;
    (*sl).nodes[0].link=1;
    (*sl).newptr=1;
    for(i=1;i<MAXSIZE-1;i++)
    {
        (*sl).nodes[i].link = i + 1;
    }
    (*sl).nodes[MAXSIZE-1].link=-1;
}

void ceratlist(slinklist *sl)     //创建
{
    int i=1,j;
    printf("请输入数据到-1时结束:\n");
    scanf("%d",&j);
    while(j!=-1)
{
       sl->nodes[i].data=j;
       i++;
       sl->newptr++;
       if(i>MAXSIZE-1) break;
       scanf("%d",&j);
   }
   sl->nodes[i].link=-1;
}

int find(slinklist sl,datatype x)  //按值查找
{
    int p=sl.nodes[0].link;
    int m=0;
    if(sl.nodes[1].data==x)
        return 1;
    while(p!=-1)
        if(sl.nodes[p].data!=x)
        {
            p=sl.nodes[p].link;
            m++;
        }

        else
            break;
        if(m)
            return p;
        else
            return m;
}

int locate(slinklist sl,int i)     //按结点查找
{
    int j=0,p=0;
    if(i<0)
        return -1;

 
    while(p!=-1&&j<i)
    {
        p=sl.nodes[p].link;
        j++;
    }
    if(i==0)
        return 0;
    return p;

}

int insert(slinklist * sl,int i,datatype x)     //在静态链表第I个结点处插入一个新结点
{
    int j=0,p=0,q;
    if(i<=0)
    {
        printf("位置不正确!");
        return 0;
    }
    while(j<i-1&&sl->nodes[p].link!=-1)
    {
        p=sl->nodes[p].link;
        j++;
    }
    if(j!=i-1&&sl->nodes[p].link==-1)
    {
        printf("位置不正确!");
        return 0;
    }
    else
    {
        q=sl->newptr;
        sl->newptr=sl->nodes[sl->newptr].link;
        sl->nodes[q].data=x;
        sl->nodes[q].link=sl->nodes[p].link;
        sl->nodes[p].link=q;
        return 1;

    }
}

//移除
int remove_l(slinklist *sl,int i)
{
    int p,q;
     p=locate((*sl),i-1);
     q=sl->nodes[p].link;
    if(p==-1)
        return 0;
    else
    {
    sl->nodes[p].link=sl->nodes[q].link;
    sl->nodes[q].link=sl->newptr;
    sl->newptr=q;
    return 1;
    }
}

void output(slinklist sl)
{
    int i,q;
    i=0;q=1;
    printf("输出数据:\n");

 
    while(sl.nodes[q].link!=-1)
    {
        printf("%d\t",sl.nodes[q].data);
        q=sl.nodes[q].link;
        i++;
     
        if(i%5==0)
            printf("\n");
    }

}
int leng(slinklist sl)
{
    int m,n=0;

}


int menu()
{
    int n;
        printf("\n\n\n\t\t\t------请选择操作------\n\t\t\t\t1:输出\n\t\t\t\t2:按值查找\n\t\t\t\t3:结点查找\n\t\t\t\t4:插入\n\t\t\t\t5:按结点删除\n\t\t\t\t6:按值删除\n\t\t\t\t7:静态链表长度\n\t\t\t\t0:退出\n");
        do
    {
        fflush(stdin);
        printf("\n\n\t\t请输入数字0-7选择功能:");
        scanf("%d",&n);
        if(n<0||n>7)
            printf("\t\t\t输入选择有错!请重新输入选项");
    }while(n<0||n>7);
    return n;


}





int main()
{
    int c,i,d,m,n;
    m=0;n=0;
    initlist(&a);
    ceratlist(&a);
    do
    {
        system("cls");          /*清屏*/
        d=menu();
       
        switch(d)
        {
            case 1:
                output(a);break;
            case 2:
                printf("请输入需要查询的值:");
                scanf("%d",&c);
                printf("\n");
                i=find(a,c);
                if(i==-1)
                    printf("查找失败,请重试!\n");
                else
                    printf("查找成功,数据在第%d位。\n",i);
                break;
            case 3:
                printf("请输入要查找的结点:");
                scanf("%d",&c);
                i=locate(a,c);
                if(i<=0)
                    printf("查找失败,请重试!\n");
                else
                    printf("查找成功,该结点数据为%d。\n",a.nodes[i].data);
                break;
            case 4:
                printf("请输入要插入结点的位置和数据(a,b):");
                scanf("%d,%d",&i,&c);
                d=insert(&a,i,c);
                if(d==0)
                    printf("插入失败,请重试!\n");
                else
                    printf("插入成功!\n");
                output(a);
                break;

            case 5:

           
                    printf("请输入需要删除的结点:");
                    scanf("%d",&c);
                    d=remove_l(&a,c);
                    if(d==0)
                        printf("删除失败,请重试!\n");
                    else
                        printf("删除成功!\n");
                    output(a);
                    break;

                case 6:
                    printf("请输入需要删除的数据:");
                    scanf("%d",&c);
                    i=find(a,c);
                    d=remove_l(&a,i);
                    if(d==0)
                        printf("删除失败,请重试!\n");
                    else
                        printf("删除成功!\n");
                    output(a);
                    break;


            case 7:
               
                       while(a.nodes[n].link!=-1)
                       {
                             n=a.nodes[n].link;
                             m++;

                       }
                printf("链表长度为:%d\n",m-1);break;
            case 0:
                printf("\n\n\n\t\t\t谢谢使用!\n");
                exit(0);
        }
    getch();
    system("cls");
    }while(d!=0);
}
搜索更多相关主题的帖子: color 
2012-10-23 12:20
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
收藏
得分:0 
不知道错那了。。。。。
2012-10-23 14:14
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
看下来有点费劲,我想知道 insert() 函数里的 else{} 中的代码是怎么实现的?这里我有点迷糊
2012-10-23 23:58
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
收藏
得分:0 
回复 3楼 真的很菜
         q=sl->newptr;          //分配结点
        sl->newptr=sl->nodes[sl->newptr].link;     //未用的结点数后移一位,
        sl->nodes[q].data=x;     //新结点赋值
        sl->nodes[q].link=sl->nodes[p].link;    //插入到查找到的i-1结点之后
        sl->nodes[p].link=q;  //修改i-1结点所指向的位置,指到新插入的地方
        return 1;    //成功后返回1

2012-10-24 20:36
babylco0
Rank: 2
等 级:论坛游民
威 望:1
帖 子:8
专家分:60
注 册:2012-10-18
收藏
得分:20 
程序代码:
int insert(slinklist * sl,int i,datatype x)     //在静态链表第I个结点处插入一个新结点
{
    int j=0,p=0,q;
    //判断位置是否正确,未考虑内存满的情况
    if(i<=0 || i > sl->newptr - 1)
    {
        printf("位置不正确!");
        return 0;
    }
    //如果位置正确,将插入节点后的元素依次后移
    for(j = sl->newptr; j>i;j--)
    {
          sl->nodes[j].data = sl->nodes[j-1].data;
          sl->nodes[j].link = j+1;
    }
    //将插入元素插入链表
    sl->nodes[j].data = x;
    sl->nodes[j].link = j+1;
    //修改结点标志
    sl->newptr++;
    sl->nodes[sl->newptr].link = -1;   
    return 1;
}

这样可以实现插入的功能,不知道你的newptr是什么作用,和link又有什么关系。
程序代码:
int insert(slinklist * sl,int i,datatype x)     //在静态链表第I个结点处插入一个新结点
{
    if(i<=0 || i > sl->newptr - 1 )
    {
        printf("位置不正确!");
        return 0;
    }
   
    sl->newptr++;
    //当插入点是第一个位置时,将原来的最后一个元素移至数组末尾,插入元素放到数组起始位置
    if(i == 1)
    {
         sl->nodes[sl->newptr].data = sl->nodes[1].data;
         sl->nodes[sl->newptr].link = sl->nodes[1].link;
         sl->nodes[1].data = x;
         sl->nodes[1].link = sl->newptr;
    }
    //将插入元素放至数组末尾,将链表串起来
    else
    {
        sl->nodes[sl->newptr].link = sl->nodes[i - 1].link;
        sl->nodes[i - 1].link = sl->newptr;
        sl->nodes[sl->newptr].data = x;       
    }
    return 1;

也可按照你的思路,可以在数组的最末尾添加一个元素,然后将链表串起来。

发现你的数组是从1开始操作的,建议你最好从0开始索引操作。
2012-10-25 11:50
快速回复:写的静态链表在插入后输出陷入死循环,但是在未插入前输出不会,不知道 ...
数据加载中...
 
   



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

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