CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

[求助]链表问题,大虾帮忙~~~~~~~~~[不看你后悔]

楼主ztwz(-_-b(偶要像海绵一样的狂吸水水!))2004-05-02 16:22:06 在 C/C++ / C语言 提问

这是我花了两天才写出来的东东,在TC2.0里能运行,但是不能实现我想要的功能~~  
  当我插入数据后它还是要新建一个链表,但是插入的数据又不输出,这是在程序设计中就没搞好的,但我太笨了,搞半天也不知道要怎么搞~~~头搞的晕晕的!!  
  看老潭的《C程序设计》都看完了,但是自己写东东还是无从下手,多数还是得看着书上来做,都不知道要怎么学C!像我这样的菜鸟是不是应该把C在学好一点在学C++?请大虾指点,小菜偶现在正郁闷中....  
  哪个大哥给一个链表的新建,插入,删除,输出的程序给我看看行吗?,我也好学学呀~~~  
  #include   "stdio.h"  
  #include   "stdlib.h"  
  #define   NULL   0  
  #define   size   sizeof(struct   stu)  
  #define   type   struct   stu  
  struct   stu  
  {  
    int   num;  
    int   age;  
    char   sex;  
    struct   stu   *next;  
    };  
  char   nan,nv;  
  type   *del();  
  type   *quit();  
  type   *inserr(type   *head)  
  {  
    type   *p,*p1,*p2;  
    p1=head;  
    printf("please   input   inserr   number\n");  
    p=(type   *)malloc(size);  
    while(1)  
    {  
      scanf("%d",&p->num);  
      if(p->num<0)  
      printf("error   num   again   number\n");  
      else  
      break;  
    }  
    if(head==p1)  
    {  
      head=p;  
      p->next=head;  
      }  
      else  
      {  
        while((p->num>p1->num)&&(p1->next!=NULL))  
          {  
            p2=p1;  
            p1=p1->next;  
          }  
      if(p->num<p1->num)  
      {  
        if(head==p1)   head=p;  
        else  
        p2->next=p;  
        p->next=p1;  
        }  
        else  
        {  
          p1->next=p;  
          p->next=NULL;  
        }  
    }  
    return(head);  
  }  
   
  type   *creat()  
  {  
    type   *head,*p1,*p2;  
    head=NULL;  
    p1=p2=(type   *)malloc(size);  
    while(p1->num!=0)  
    {  
    if(head==0)  
    head=p1;  
    else  
    p2->next=p1;  
    p2=p1;  
    p1=(type   *)malloc(size);  
    printf("num   age   sex:\n");  
    do  
        {  
          scanf("%d%d%s",&p1->num,&p1->age,&p1->sex);  
          if((p1->num<0)&&(p1->age<0)&&(p1->age>100))  
          printf("error   num   age   sex:\n");  
          else  
          break;  
          }while(1);  
    }  
    p2->next=NULL;  
    return(head);  
  }  
   
  print(type   *head)  
  {  
    type   *p;  
    if(head==NULL)  
    printf("no   table");  
    else  
    p=head;  
    p=p->next;  
    do  
    {  
      printf("num=%-3dage=%-3dsex=%-3c\n",p->num,p->age,p->sex);  
      p=p->next;  
      }while(p->num!=NULL);  
  }  
   
  main()  
  {  
    int   n;  
    type   *head;  
    printf("\tplease   input   1~3   number:\n");  
    printf("(1)new   table\t");  
    printf("(2)cha   table\n");  
    printf("(3)exit\n");  
    while(1)  
    {  
    scanf("%d",&n);  
    if(n==1||n==2||n==3)  
    break;  
    else  
    printf("please   again   input   num\n");  
    }  
    switch(n)  
    {  
      case   1:  
      {  
        creat();  
        head=creat();  
      }  
      case   2:   inserr(head);  
    /*   case   3:   del();                               太菜了,写不出来~~~~~~~~~~  
      case   4:   quit();   */  
    }  
    head=creat();  
    print(head);  
    getch();  
  }  
   问题点数:50、回复次数:4Top

1 楼Cathryn0000000(苹果雹冰oοО)回复于 2004-05-02 17:32:54 得分 25

/*   bo2-2.c   单链表线性表(存储结构由c2-2.h定义)的基本操作(12个)   */  
    Status   InitList(LinkList   *L)  
    {   /*   操作结果:构造一个空的线性表L   */  
        *L=(LinkList)malloc(sizeof(struct   LNode));   /*   产生头结点,并使L指向此头结点   */  
        if(!*L)   /*   存储分配失败   */  
            exit(OVERFLOW);  
        (*L)->next=NULL;   /*   指针域为空   */  
        return   OK;  
    }  
   
    Status   DestroyList(LinkList   *L)  
    {   /*   初始条件:线性表L已存在。操作结果:销毁线性表L   */  
        LinkList   q;  
        while(*L)  
        {  
            q=(*L)->next;  
            free(*L);  
            *L=q;  
        }  
        return   OK;  
    }  
   
    Status   ClearList(LinkList   L)   /*   不改变L   */  
    {   /*   初始条件:线性表L已存在。操作结果:将L重置为空表   */  
        LinkList   p,q;  
        p=L->next;   /*   p指向第一个结点   */  
        while(p)   /*   没到表尾   */  
        {  
            q=p->next;  
            free(p);  
            p=q;  
        }  
        L->next=NULL;   /*   头结点指针域为空   */  
        return   OK;  
    }  
   
    Status   ListEmpty(LinkList   L)  
    {   /*   初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE   */  
        if(L->next)   /*   非空   */  
            return   FALSE;  
        else  
            return   TRUE;  
    }  
   
    int   ListLength(LinkList   L)  
    {   /*   初始条件:线性表L已存在。操作结果:返回L中数据元素个数   */  
        int   i=0;  
        LinkList   p=L->next;   /*   p指向第一个结点   */  
        while(p)   /*   没到表尾   */  
        {  
            i++;  
            p=p->next;  
        }  
        return   i;  
    }  
   
    Status   GetElem(LinkList   L,int   i,ElemType   *e)   /*   算法2.8   */  
    {   /*   L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR   */  
        int   j=1;   /*   j为计数器   */  
        LinkList   p=L->next;   /*   p指向第一个结点   */  
        while(p&&j<i)   /*   顺指针向后查找,直到p指向第i个元素或p为空   */  
        {  
            p=p->next;  
            j++;  
        }  
        if(!p||j>i)   /*   第i个元素不存在   */  
            return   ERROR;  
        *e=p->data;   /*   取第i个元素   */  
        return   OK;  
    }  
   
    int   LocateElem(LinkList   L,ElemType   e,Status(*compare)(ElemType,ElemType))  
    {   /*   初始条件:   线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)   */  
        /*   操作结果:   返回L中第1个与e满足关系compare()的数据元素的位序。   */  
        /*                       若这样的数据元素不存在,则返回值为0   */  
        int   i=0;  
        LinkList   p=L->next;  
        while(p)  
        {  
            i++;  
            if(compare(p->data,e))   /*   找到这样的数据元素   */  
                return   i;  
            p=p->next;  
        }  
        return   0;  
    }  
   
    Status   PriorElem(LinkList   L,ElemType   cur_e,ElemType   *pre_e)  
    {   /*   初始条件:   线性表L已存在   */  
        /*   操作结果:   若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,   */  
        /*                       返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE   */  
        LinkList   q,p=L->next;   /*   p指向第一个结点   */  
        while(p->next)   /*   p所指结点有后继   */  
        {  
            q=p->next;   /*   q为p的后继   */  
            if(q->data==cur_e)  
            {  
                *pre_e=p->data;  
                return   OK;  
            }  
            p=q;   /*   p向后移   */  
        }  
        return   INFEASIBLE;  
    }Top

2 楼Cathryn0000000(苹果雹冰oοО)回复于 2004-05-02 17:33:20 得分 25

Status   NextElem(LinkList   L,ElemType   cur_e,ElemType   *next_e)  
    {   /*   初始条件:线性表L已存在   */  
        /*   操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,   */  
        /*                       返回OK;否则操作失败,next_e无定义,返回INFEASIBLE   */  
        LinkList   p=L->next;   /*   p指向第一个结点   */  
        while(p->next)   /*   p所指结点有后继   */  
        {  
            if(p->data==cur_e)  
            {  
                *next_e=p->next->data;  
                return   OK;  
            }  
            p=p->next;  
        }  
        return   INFEASIBLE;  
    }  
   
    Status   ListInsert(LinkList   L,int   i,ElemType   e)   /*   算法2.9。不改变L   */  
    {   /*   在带头结点的单链线性表L中第i个位置之前插入元素e   */  
        int   j=0;  
        LinkList   p=L,s;  
        while(p&&j<i-1)   /*   寻找第i-1个结点   */  
        {  
            p=p->next;  
            j++;  
        }  
        if(!p||j>i-1)   /*   i小于1或者大于表长   */  
            return   ERROR;  
        s=(LinkList)malloc(sizeof(struct   LNode));   /*   生成新结点   */  
        s->data=e;   /*   插入L中   */  
        s->next=p->next;  
        p->next=s;  
        return   OK;  
    }  
   
    Status   ListDelete(LinkList   L,int   i,ElemType   *e)   /*   算法2.10。不改变L   */  
    {   /*   在带头结点的单链线性表L中,删除第i个元素,并由e返回其值   */  
        int   j=0;  
        LinkList   p=L,q;  
        while(p->next&&j<i-1)   /*   寻找第i个结点,并令p指向其前趋   */  
        {  
            p=p->next;  
            j++;  
        }  
        if(!p->next||j>i-1)   /*   删除位置不合理   */  
            return   ERROR;  
        q=p->next;   /*   删除并释放结点   */  
        p->next=q->next;  
        *e=q->data;  
        free(q);  
        return   OK;  
    }  
   
    Status   ListTraverse(LinkList   L,void(*vi)(ElemType))  
    /*   vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同   */  
    {   /*   初始条件:线性表L已存在   */  
        /*   操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败   */  
        LinkList   p=L->next;  
        while(p)  
        {  
            vi(p->data);  
            p=p->next;  
        }  
        printf("\n");  
        return   OK;  
    }Top

3 楼Cathryn0000000(苹果雹冰oοО)回复于 2004-05-02 17:34:41 得分 0

楼主能不能快点结贴啊,我跟朋友打赌,说我三天之内升到五个裤衩,等分用啊Top

4 楼ztwz(-_-b(偶要像海绵一样的狂吸水水!))回复于 2004-05-02 19:46:10 得分 0

好谢谢,给分~~Top

相关问题

  • ★★★书上的一道关于链表的例题,请大家看一看,谢谢了。我给100分!不来后悔!!
  • 当然看完更后悔
  • *****************不看的一定后悔!!!!!!!***************
  • 不看你会后悔的!
  • 不看肯定后悔
  • ***不看会后悔,程序集问题***
  • 比较搞笑!不看后悔!
  • 史上最恶心的8个笑话(不看后悔 看了也后悔)
  • ◇◆◇ 给大家绝对好看的东西,不看后悔:) (enmity) ◇◆◇
  • 下面的网址千万别看,看了你会后悔!

关键词

  • 结点
  • 数据
  • 函数
  • 算法
  • 指针
  • linklist
  • 初始条件
  • elemtype
  • 线性表
  • next

得分解答快速导航

  • 帖主:ztwz
  • Cathryn0000000
  • Cathryn0000000

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo