| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1265 人关注过本帖
标题:自己写顺序线性链表~~出错咯~~
只看楼主 加入收藏
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
结帖率:95.65%
收藏
已结贴  问题点数:5 回复次数:30 
自己写顺序线性链表~~出错咯~~
头文件:
程序代码:
/*....This is a head files...*/
#include<stdlib.h>
#define ERROR 0 
#define OverFlow -1 
#define OK 1
#define INCREASE_ADDRESS_MIN 50
#define INCREASE_ADDRESS_MAX 100


typedef int status;//声明status为int型
int GetNumberofUnit(char *p);
char *CreateOrderList(char **p,int num);
void DealError();
status Deal_If_Char(char The_Value);
void InputData(char *p);
void OutPut(char *p);
status InsertValue(char The_value,int Insert_Positon,char *OriginAdress);
status DelData(char *First_Address,int position);
void All_View(char *First_Address);

int GetNumberofUnit(char *p)//计算顺序表单元个数 
{
    int i;
    for(i=0;*(p+i)!=NULL;i++);
    return i; 
}

char* CreateOrderList(char **p,int num)//p用来操作指针变量,num为要创建的顺序表的单元个数 
{
    *p=(char*)malloc((num+1)*sizeof(char));//
    if(!(*p))
    {
       DealError();
    }
    *(*p+num)=NULL;//结束标志 
    return (*p); 
} 

void DealError()//错误处理 
{
        printf("Error!");
        exit(OverFlow);
} 

status Deal_If_Char(char The_Value)//判断是否为字符 
{
    if((The_Value>65&&The_Value<90||The_Value>97&&The_Value<122))
    return OK;
    else
    {
        printf("Error!!!Not a char\n");
        printf("Please Try Again!!\n");
        return ERROR;
    }
}

void InputData(char *p)//输入数据,传入一级指针即可 
{
    char *D_address;//动态变化地址 
    D_address=p;
    printf("%d",GetNumberofUnit(p));//测试语句 
    while(D_address<=p+GetNumberofUnit(p))
    {
        scanf("%c",D_address);//D_address所指的内存单元地址
        D_address++; 
    } 
}

void OutPut(char *p)//输出函数 
{
    char *D_address;//动态地址 
    D_address=p;
    printf("%d",GetNumberofUnit(p));//测试语句 
    while(D_address<=p+GetNumberofUnit(p))
    {
        printf("%c",*p);//取一级指针p所指内存单元的值 
        p++;//地址前进一个sizeof(char)大小 
    }
    
}

status InsertValue(char The_Value,int Insert_Position,char *OriginAdress)
{
    int Current_Address,i;
    char *new_address; char *Point_The_Value;
    Current_Address=GetNumberofUnit(OriginAdress);//获取当前已分配内存单元 
    Deal_If_Char(The_Value);
    if(Insert_Position>0&&Insert_Position<Current_Address)//判断插入位是否合法 
    {
         new_address=(char*)malloc((INCREASE_ADDRESS_MIN+Current_Address)*sizeof(char));//分配一块更大的内存块 
         if(!new_address)
        {// 
            DealError();
        }//
         
         Point_The_Value=new_address+Insert_Position-1;//计算插入位 
         *Point_The_Value=The_Value;//将值插入 
         
           for(i=0;i<Insert_Position-1;i++)//将插入位前段数据复制到新内存 
             *(new_address+i)=*(OriginAdress+i);
           for(i=Insert_Position-1;i<Current_Address-Insert_Position+2;i++)//
             *(new_address+i+1)=*(OriginAdress+i);//此时i为原始内存单元的末位 
             
             i=i+2;                        //末位为标志位 
             *(new_address+i)=NULL;
             return OK;
     
    }
    return ERROR;                                                                                                                             
}

status DelData(char *First_Address,int position)
{
   int i,end_address;char *p;
   end_address=GetNumberofUnit(First_Address);
   p=First_Address+position;//要删除位的后一位 
   if(position<0||position>end_address) return ERROR;
   while(*p!=NULL)
   {
       *(p-1)=*p;
       p++;
   }
   *(p-1)=*p;
   return OK; 
}

void All_View(char *First_Address)//遍历函数 
{
    printf("准备输出:");
    while(*First_Address!=NULL)
    {
        printf("%c ",*First_Address);
        First_Address++;
    }
    
}


主程序
程序代码:
#include <stdio.h>
#include "OrderList.h"

void main()
{
    char *T;
    printf("Start Creating OrderList,");
    T=CreateOrderList(&T,5);//创建顺序线性表. 
    printf("please type data\n");
    InputData(T); //输入数据
    printf("输出第一次输入的数据\n");
    All_View(T);//遍历顺序线性表 
} 


测试时当测试输出总是3,不知CreateOrderList有什么错的~~~。。。
偶的思路是用CreateOrderList分配一块内存单元,num位这块内存单元中char类型元素的个数~~~
偶不才,那位大虾帮看看吧~~~~~
搜索更多相关主题的帖子: status color 
2012-01-24 21:19
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
数据结构真难啃~~~~~

在线等待

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-24 21:22
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
如果认为代码太长,帮看看CreateOrderList这个函数有什么错就好咯~~~
~~~~~也许知识掌握不到位~~~~或是太笨咯
GetNumberOfUnit获得的始终是3。。。。。。。。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-24 21:28
闲出屁
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:612
注 册:2012-1-24
收藏
得分:0 
神奇 我家小城市网吧竟然有VC编译器
简单看了下 有两个地方感觉比较危险和不能这么弄:
*p=(char*)malloc((num+1)*sizeof(char));
之后应该是初始化 要不*(*p+num)=NULL;之外也有0怎么办 还有用0只能是一种约定 不能当作这个空间的长度获取

while(D_address<=p+GetNumberofUnit(p))
这个有逻辑错误
while(D_address<=p+GetNumberofUnit(p))
    {
        printf("%d,%d\n", D_address,p+GetNumberofUnit(p));
        scanf("%c",D_address);//D_address所指的内存单元地址
        fflush(stdin);
        D_address++;
    }
运行下你就明白了 测试后会感觉到非常悲催 呵呵
其他的地方你自己看把 我下机了

乔布斯是神 宫崎骏也是神~~ 才知道 原来士兵突击的主题曲是久石让的 久石让的音乐 真传神
2012-01-24 21:46
闲出屁
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:612
注 册:2012-1-24
收藏
得分:0 
while(D_address    <    p+GetNumberofUnit(p))

乔布斯是神 宫崎骏也是神~~ 才知道 原来士兵突击的主题曲是久石让的 久石让的音乐 真传神
2012-01-24 21:47
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
什么叫顺序线性链表?
线性表就是线性表,按存储结构不同分为顺序表和链表。
你的代码是顺序表(其实就是一维数组)。问题挺多,如果没人帮助,明天解释给你。

重剑无锋,大巧不工
2012-01-24 21:55
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
回复 6楼 beyondyf
嗯嗯~~表示写错咯。。。。本来是要写顺序线性表的~~。。。。。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-24 22:02
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
回复 6楼 beyondyf
版主怎么不见咯~~等得我都要老咯

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-25 14:44
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:0 
高手指教点啊~~等得花都谢咯

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-25 15:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,小妹妹,哥哥已经成家立业了,不能时时都泡在网上陪你玩啊。
你的InputData和InsertValue都有问题。
解释起来太麻烦。待会儿给你重写一个。

重剑无锋,大巧不工
2012-01-25 15:33
快速回复:自己写顺序线性链表~~出错咯~~
数据加载中...
 
   



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

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