回 帖 发 新 帖 刷新版面

主题:对单链表中几种”复杂“问题的程序斑竹你修改一下 我觉得可以作为精贴的

晚上写的 自己的电脑不能上网 郁闷死了
调了一下 有语法错误 不知道在那里 我用的编译器为WIN TC 如果大家有时间看帮我看看
 /*本程序的目的是对单连表总元素进行 排序 倒置 和删除相同的元素*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.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=0;i<N;i++)
     { q=(LinkList)malloc(sizeof(Node));
       if(q==NULL)
       { printf("out of place");
         exit(OVERFLOW);
         }
         scanf("%d",&(q->data));
         q->next=p->next;
         p->next=q;
         p=q;
         }
     return OK;
     }
 status LinkListSort(LinkList L)   /*对单链表的元素进行排序*/
 { Node *p;
   int t ,i=0;
   p=L;
   while((i<(N*(N-1)/2))&&(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;
         }
           i++;
       p=p->next;
     }
       return OK;
}
 status DeleteSameElement (LinkList L)  /*删除相同的元素*/
 { Node *p,*q;
   int x;
    p=L->next;
    while(p->next!=NULL)
    { q=p;
      x=p->data;
      p=p->data;
      while(p!=NULL)
      { if(x==p->data)      /*将相同的元素赋值为0  在下面判断如果元素值为0  释放这个接点*/
        p->data=0;
        p=p->data;
      }
     p=q;
     p=p->next;
     }
    p=L->next;
   while(p!=NULL)
   {
    if(p->next->data==0)
     {
        q=p->next;
        p->next=q->next;
        free(q);
      }
   }
    return OK;
  }


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

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

 return OK;
 }
 status FreeLinkList(LinkList L)   /*释放接点*/
 { Node *p,*q;
   p=L->next;
    while(p!=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);

  return OK;
 }

 

回复列表 (共1个回复)

沙发

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;
                }
           }
 

我来回复

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