回 帖 发 新 帖 刷新版面

主题:单链表表的倒置 删除相同的元素 排序操作

昨天晚上写了个程序 发到上面 没有多少人帮忙解决 
今天修改好了 发到上面大家看看  如果有好的建议 可以给我留言谢谢
如果是初学者可以参考一下 程序 相互学习一下
可以运行的  验证基本正确(还有点问题 希望大家纠正)
#include"stdio.h"
#define N 10  /*代表要处理的元素个数*/
#define OK  1
#define NULL 0
#define OVERFLOW 0
typedef int ElemType;
typedef int status;
typedef struct Node{ ElemType data;
                     struct Node   *next;
                    }Node,*LinkList;
   status InitLinkList(LinkList *L)  /*初始化单链表*/
   { Node *p,*q;
      int i;
     *L=(LinkList)malloc(sizeof(Node));
     printf("请输入元素"); /*元素个数为N*/
     if(!L)
     { printf("out of memory");
       exit(OVERFLOW);
      }
     (*L)->next=NULL;
     p=L;

     for(i=N;i>0;i--)
     { q=(LinkList)malloc(sizeof(Node));
          if(q==NULL)
         { printf("out of place");
           exit(OVERFLOW);
         }
         scanf("%d",&(q->data));
         q->next=NULL;
         p->next=q;
         p=q;
         }
     return (L);
  }
 status LinkListSort(LinkList L)   /*对单链表的元素进行排序*/
 { Node *p;
   int t ,i=0;


   while(i<(N*(N-1)/2))
   {   p=L->next;
      while (p->next!=NULL)    /*N为元素个数 元素要比较N*(N-1)/2次*/
     {   if(p->data>p->next->data)   /*相互之间换值*/
        {  t=p->data;
           p->data=p->next->data;
           p->next->data=t;
         }

       p=p->next;
     }
      i++;}
       return OK;
}
 status DeleteSameElement (LinkList L)  /*删除相同的元素*/
 { Node *p,*q;
   int e;
    p=L->next;
    while(p!=NULL)
    { q=p;
      e=p->data;
      p=p->next;
      while(p!=NULL)
      { if(e==p->data)      /*将相同的元素赋值为0  在下面判断如果元素值为0  释放这个接点*/
        p->data=0;
         p=p->next;
      }
     p=q;
     p=p->next;
     }
    p=L;
     while(p!=NULL)
   {
    if(p->next->data==0)
     {
        q=p->next;
        p->next=q->next;
        free(q);
      }
    p=p->next;
   }

    return OK;
  }


 status LinkListReverse(LinkList L)    /*对单链表中的元素倒置*/
 { int a[N] ,i=0,count=0;
    LinkList Lb;
    Node *p,*q;
    p=L->next;
    while(p!=NULL)
     {
       a[i++]=p->data;
       p=p->next;
        count++;
       }



  Lb=(LinkList)malloc(sizeof(Node));   /*重新建立一个单链表 将倒置后的元素放在Lb中*/
   { if(Lb==NULL)
     { printf("out of place");
        exit(OVERFLOW);
        }
      Lb->next=NULL;
      p=Lb;
    for(i=count-1;i>=0;i--)
      {q=(LinkList)malloc(sizeof(Node));
        if(q==NULL)
        { printf("out of place");
        exit(OVERFLOW);
        }
       q->data=a[i];
       q->next=NULL;
       p->next=q;
       p=q;
       }
       }
   p=Lb->next;               /*输出倒置后的单链表*/
  while(p!=NULL)
  { printf("%4d",p->data);
      p=p->next;}

 return OK;
 }
 status FreeLinkList(LinkList L)   /*释放接点*/
 { Node *p,*q;
   p=L;
    while(p->next!=NULL)
      { q=p;
       p=p->next;
       free(q);
       }
   return OK;
   }
 status PrintLinkList(LinkList L) /*打印出单链表*/
 { Node *p;
   p=L->next;
   printf("处理之后的单链表为:");
   while(p!=NULL)
   { printf("%4d",p->data);
       p=p->next;}
    getchar();
  return OK;
 }

回复列表 (共3个回复)

沙发

main()        /*主函数*/
 { LinkList L;
   int flag;
   int select;
   InitLinkList(L);


    while(1){
               do{ printf("\n*****************1:对单链表中的元素进行排序*****************");
                  printf("\n*****************2:删除单链表中相同的元素*****************");
                  printf("\n*****************3:对单链表中的元素进行倒置*****************");
                  printf("\n*****************4:释放单链表*****************");
                  printf("\n*****************5:退出");
                  printf("请选择你要执行的语句前的数字");
                  scanf("%d",&select);
                  if(select==5)
                    flag=0;
                  }while(select>5&&select<0);
                  if(flag==0)
                   break;
                   switch(select)
                       {  case 1:LinkListSort(L);
                                 PrintLinkList(L);
                                 break;
                          case 2:DeleteSameElement(L);
                                  PrintLinkList(L);
                                  break;
                          case 3:LinkListReverse(L);

                                   break;
                          case 4: FreeLinkList(L);
                                     break;
                           default:printf("您选择的数字有误 请重新输入");
                                    break;
                         }
                }
                system("pause");
                return 0;
                }

板凳

1.没输入控制条件,输入超出范围的数会出错
2.释放空间后不能再输入新数据
3.释放空间后还能进行排序

3 楼

谢谢楼上的 我在改改

我来回复

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