回 帖 发 新 帖 刷新版面

主题:大家帮看看一起学习

#include"stdio.h"
#include"malloc.h"
#define ERROR -1
#define  OK  1
#define NULL 0

typedef int status;
typedef int LElemType;
typedef struct LNode { LElemType elem;
                        struct LNode *next;
                        }LNode,*LinkList;
status CreatLinkList(LinkList L,int n)   /*创建带头结点的单链表*/
{   int i,j;
    LNode *p,*q;
      L=(LinkList)malloc(sizeof(LNode));
      if(L==NULL){printf("out of space");return ERROR;}
        L->next=NULL;
      q=L;            /* 不要用L 去叠代,那样怎么返回链表呢?*/
      for(i=n,j=1;i>0;i--)
      {
       p=(LinkList)malloc(sizeof(LNode));
       if(p==NULL){printf("out of space");return ERROR;}
       printf("\n**********请输入第%d个元素********\n",j) ;
       scanf("%d",&(p->elem));
       p->next=q->next;
       q->next=p;
       q=p,j++; }
       return 0;
  }
    status DeleteLinkList(LinkList L,int i)  /*删除单链表中的元素*/
    {

    LNode *p,*q;int j=1;
    p=L->next ;
    while(p&&j<i-1)
   { p=p->next;j++;}
   if(!p&&(j=i-1))
   return ERROR;

    q=p->next;
    p->next=q->next;
    free(q);
    return 0;
    }
    status IinkListInsert(LinkList L,int i,LElemType e) /*插入元素*/
     {

       LNode *p,*q,*s;int j;
       p=L->next;j=1;
       s=(LinkList)malloc(sizeof(LNode));
          if(s==NULL){printf("out of space"); return ERROR;}
       while(p&&j<i-1)
           p=p->next;

        if(!p)
          return ERROR;

         s->next=p->next;
         p->next=s;
         s->elem=e;
        return 0;
        }

   status Delete_head (LinkList L)  /*删除头元素*/

   { LinkList p;
   p=L->next;
   if(p!=NULL)
  { L->next=p->next;
   free(p);}
   else  return 0;
   }
   status Delete_tail(LinkList L)      /*删除尾元素*/
    {  LinkList p,q;
     p=L->next;
      while(p->next->next)
        p=p->next;
        q=p->next;
       p->next=NULL;
       free(q);
       return 0;
       }
  void output(LinkList head)
{
        LinkList p;
        p=head->next;
        do
        {
                printf("%8d",p->elem);
                p=p->next;
        }
        while(p!=NULL);
                



    main()
    {
        LinkList L;
        int n,i,e;
        printf("请输入你要输入单链中元素的个数");
         scanf("%d",&n);
        CreatLinkList(L, n);
         output( L)  ;
         printf("\n********************************请输入需要删除元素的位置:");
          scanf("%d", &i);
        DeleteLinkList(L, i) ;
              output( L)  ;
         printf("\n********************************请输入需要插入元素的位置和值:");


         scanf("%d%d",&i,&e);
          IinkListInsert(L, i, e) ;
                output( L)  ;
          printf("\n********************************删除头元素的操作********************************\n");
          Delete_head ( L);
           output( L);
           printf("\n********************************删除尾元素的操作********************************\n");
            Delete_tail( L);
               output( L);


           printf("\n********************************请按任意键退出**********************************\n");
               system("pause");
           }

本程序可以运行 但是当输入几个值后  输出结果一直为0  不知道怎么回事 我现在正在改
如果改好了 就告诉大家一声 如果有谁发现了错误 麻烦给我一点点提示  谢谢

回复列表 (共2个回复)

沙发

自己写个库

urlib.h

#ifndef __urlib
#define __urlib

在这里定义你的数据结构和接口函数的申明,以及常量申明、宏等

#endif

urlib.cpp
#include "urlib.h"
写上所有那些操作的现实(函数定义)

用一个专门的文件urlibTest.cpp集中测试
#include "urlib.h"
int main(){}

测试通过之后,在以后的工程中需要的地方直接引用
#include "urlib.h"
就像引用系统提供的函数一样,这样会缩小调试的范围,就像现在编程时你不会怀疑printf();会出错吧。

这是我建议的方法。对于具体的这个问题,我试试帮你调~~

板凳

#include"stdio.h"
#include"malloc.h"
#define ERROR -1
#define  OK  1
#define NULL 0

typedef int status;
typedef int LElemType;
typedef struct LNode { LElemType elem;
                        struct LNode *next;
                        }LNode,*LinkList;
status CreatLinkList(LinkList *L,int n)   /*创建带头结点的单链表*/
{   int i,j;
    LNode *p,*q;
      (*L)=(LinkList)malloc(sizeof(LNode));
      if((*L)==NULL){printf("out of space");return ERROR;}
        (*L)->next=NULL;
      q=*L;            /* 不要用L 去叠代,那样怎么返回链表呢?*/
      for(i=n,j=1;i>0;i--)
      {
       p=(LinkList)malloc(sizeof(LNode));
       if(p==NULL){printf("out of space");return ERROR;}
       printf("\n**********请输入第%d个元素********\n",j) ;
       scanf("%d",&(p->elem));
       p->next=q->next;
       q->next=p;
       q=p,j++; }
       return 0;
  }
    status DeleteLinkList(LinkList L,int i)  /*删除单链表中的元素*/
    {

    LNode *p,*q;int j=1;
    p=L->next ;
    while(p&&j<i-1)
   { p=p->next;j++;}
   if(!p&&(j=i-1))
   return ERROR;

    q=p->next;
    p->next=q->next;
    free(q);
    return 0;
    }
    status IinkListInsert(LinkList L,int i,LElemType e) /*插入元素*/
     {
       LNode *p,*s;
       int j;
       p=L->next;j=1;
       s=(LinkList)malloc(sizeof(LNode));
          if(s==NULL){printf("out of space"); return ERROR;}
       while(p&&j<i-1)
           p=p->next;

        if(!p)
          return ERROR;

         s->next=p->next;
         p->next=s;
         s->elem=e;
        return 0;
        }

   status Delete_head (LinkList L)  /*删除头元素*/

   { LinkList p;
   p=L->next;
   if(p!=NULL)
  { L->next=p->next;
   free(p);
   return 1;
   }
   else  return 0;
   }
   status Delete_tail(LinkList L)      /*删除尾元素*/
    {  LinkList p,q;
     p=L->next;
      while(p->next->next)
        p=p->next;
        q=p->next;
       p->next=NULL;
       free(q);
       return 0;
       }
  void output(LinkList head)
{
        LinkList p;
        p=head->next;
        do
        {
                printf("%8d",p->elem);
                p=p->next;
        }
        while(p!=NULL);
                



    void main()
    {
        LinkList L;
        int n,i,e;
        printf("请输入你要输入单链中元素的个数");
         scanf("%d",&n);
        CreatLinkList(&L, n);
         output( L)  ;
         printf("\n********************************请输入需要删除元素的位置:");
          scanf("%d", &i);
        DeleteLinkList(L, i) ;
              output( L)  ;
         printf("\n********************************请输入需要插入元素的位置和值:");


         scanf("%d%d",&i,&e);
          IinkListInsert(L, i, e) ;
                output( L)  ;
          printf("\n********************************删除头元素的操作********************************\n");
          Delete_head ( L);
           output( L);
           printf("\n********************************删除尾元素的操作********************************\n");
            Delete_tail( L);
               output( L);


           printf("\n********************************请按任意键退出**********************************\n");
               //system("pause");
           }


改成这样了,现在第二次删除会出错,还有删除操作不安全,超出链表范围就出错了~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册