现在的位置: 首页 > 综合 > 正文

数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!

2014年10月16日 ⁄ 综合 ⁄ 共 5709字 ⁄ 字号 评论关闭

  本人正在学习数据结构,以下代码都是自己亲自写出来的,虽然有些代码写得不是很好,但是每个函数都是根据自己的思路写出来的。数据结构学的时间也不是很短了,刚开始不会应用到程序里。现在会了,觉得学习数据结构最重要的一点是,必须理解所学的算法,然后才能运用到程序中。同学看了我的程序说我写的程序跟别人的不一样。说我从特殊到一般来写的。说句实话,如果我没有思路,我绝对写不出程序。可能是不理解,或者是自己爱钻牛角尖吧,或者是自己太笨吧。。。不管怎么样,我都不会放弃的,我会努力吃透的。。。嘿嘿!!

#include<stdio.h>
typedef int ElemType;
typedef struct LNode{
 ElemType data;
 struct LNode *next;
}LNode,*LinkList;

LinkList createListL(LinkList head,int n);
LinkList createListH(LinkList head,int n);
LinkList traveral(LinkList head);
LinkList transpose(LinkList head);
LinkList transpose2(LinkList head, int size);
LinkList DelOuShu(LinkList head);
void separate(LinkList head,LinkList head1);
LinkList add_CreatL(LinkList head,int n);
LinkList merge(LinkList head3,LinkList head1,LinkList head2);
int main(void){
 LinkList head,head1,head2,head3;
 int n,num;
 head=(LinkList)malloc(sizeof(LNode));
 head1=(LinkList)malloc(sizeof(LNode));
 head2=(LinkList)malloc(sizeof(LNode));
 head3=(LinkList)malloc(sizeof(LNode));
 head->next=NULL;
 
 printf("(1) 随机产生或键盘输入一组元素序列,建立一个带头结点的单向链表(无序);\n");
 printf("(2) 遍历单向链表(即显示顺序表);\n");
 printf("三选一:\n");
 printf("(3) 把单向链表中元素逆置(不允许申请新的结点空间);\n");
 printf("(4) 在单向链表中删除所有的偶数元素结点;\n");
 printf("(5) 实现将单向链表其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间);\n");
 printf("附加题:\n");
 printf("(6) 编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表;\n");
 printf("(7) 利用上题算法建立两个非递减有序单向链表,然后合并成一个非递增链表;\n");
 while(num!=0){
  printf("请选择:\n");
  scanf("%d",&num);
  switch(num){
   case 1:
     printf("请输入插入元素的个数:");
     scanf("%d",&n);
     head=createListH(head,n);break;
   case 2:
     head=createListH(head,n);
     printf("\n");
     traveral(head);break;
   case 3:
     printf("逆置后的顺序为:\n");
     head=transpose(head);
     traveral(head);break;
   case 4:
     printf("请输入链表元素的个数:");
     scanf("%d",&n);
     head=createListL(head,n);
     traveral(head);
     printf("\n");
     head=DelOuShu(head);
     traveral(head);break;
   case 5:
     printf("请输入链表元素的个数:");
     scanf("%d",&n);
     head=createListL(head,n);
     traveral(head);
     separate(head,head1);break;
   case 6:
     printf("请输入链表元素的个数:");
     scanf("%d",&n);
     head=add_CreatL(head,n);
     traveral(head);break;
   case 7:
     printf("请输入链表元素的个数:");
     scanf("%d",&n);
     head1=add_CreatL(head1,n);
     traveral(head1);
     printf("请输入链表元素的个数:");
     scanf("%d",&n);
     head2=add_CreatL(head2,n);
     traveral(head2);
     head3=merge(head3,head1,head2);
     printf("hao");
     traveral(head3);
  }
 }
 
}
//(1) 随机产生或键盘输入一组元素序列,建立一个带头结点的单向链表(无序);
LinkList createListH(LinkList head,int n){
 LinkList ns ;
 int i;
 head=(LinkList)malloc(sizeof(LNode));
 head->next=NULL;
 //printf("随机产生3个数字:");
 for(i=0;i<n;i++){
  ns=(LinkList)malloc(sizeof(LNode));
  ns->data=rand()%100+1;
  ns->next=head->next;
  head->next=ns;
  printf("%d",ns->data);
  printf("\n");
 }
  return head;
}
LinkList createListL(LinkList head,int n){
 LinkList r,s;
 int i;
 head=(LinkList)malloc(sizeof(LNode));
 r=head;
 //head->next=NULL;
 for(i=0;i<n;i++){
  s=(LinkList)malloc(sizeof(LNode));
  s->data=rand()%100+1;
  r->next=s;
  r=s;
  //printf("%d",s->data);
  //printf("\n");
 }
 r->next=NULL;
 return head; 
}
//(2) 遍历单向链表(即显示顺序表);
LinkList traveral(LinkList head){
 LinkList p;
 //head=(LinkList)malloc(sizeof(LNode));
 p=head->next;
 while(p){
  printf("%d",p->data);
  p=p->next;
  printf("\n");
 } 
}
//单链表的逆置
LinkList transpose(LinkList head){
 LinkList q,p,r,s;
 if(head==NULL||head->next==NULL){
  return NULL;
 }
 s=head->next;
 r=s->next;
 p=s->next;
 while(r){
  q=head->next;
  head->next=r;
  s->next=r->next;
  p=r;
  r=r->next;
  p->next=q; 
 }

 return head;
}
LinkList transpose2(LinkList head, int size){
 int i;
 
 LinkList point[size],s;
 point[0]=head->next;
 s=head->next;
 
 for(i=1;i<=size-1;i++){
  
  point[i]=s->next;
  printf("dizhi=%d\t",point[i]->data);
  s=s->next;
  //point[i]->next=point[i-1];
 }
 for(i=size-1;i>0;i--){
  point[i]->next=point[i-1];
  printf("dizhi=%d\t",point[i]->data);
 }
 point[0]->next=NULL;
 head->next = point[size-1];
 return head;
}
//(2) 在单向链表中删除所有的偶数元素结点;
LinkList DelOuShu(LinkList head){
 LinkList p,r;
 if(head==NULL||head->next==NULL){
  return NULL;
 }
 p=head;
 while(p->next!=NULL){ 
  if(p->next->data%2==0){
   r=p->next;
   p->next=r->next;
   free(r);
  }
  else
  {
   p=p->next;
  }
 }
 return head;
}
//(3) 实现将单向链表其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间);
void separate(LinkList head,LinkList head1){
 LinkList p,q,s,r;
 p=head;
 r=head1;
 while(p->next!=NULL){
  if(p->next->data%2==0){
   s=(LinkList)malloc(sizeof(LNode));
   s->data=p->next->data;
   p->next=p->next->next;
   r->next=s; 
   r=s;   
  }
  else{
   p=p->next;    
  }
 }
 r->next=NULL;
 printf("变换后的奇数序列:\n");
 traveral(head);
 printf("\n");
 printf("变换后的偶数序列:\n");
 traveral(head1);
}
//(1) 编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表;
LinkList add_CreatL(LinkList head,int n){
 LinkList s,r,p;
 int i,num;
 num=n;
 r=head;
 s=(LinkList)malloc(sizeof(LNode));
 s->data=rand()%100+1;
 s->next=NULL;
 r->next=s;
 r=s;
 for(i=1;i<num;i++){
  s=(LinkList)malloc(sizeof(LNode));
  s->data=rand()%100+1;
  s->next=NULL;
  
  if(s->data>=r->data){
   r->next=s; 
   r=s;
  }
  else{
   p=head;
   while(p->next!=NULL){
    if(s->data>=p->next->data){
     p=p->next;
    }
    else{
     break; 
    }
   }
    s->next=p->next;
    p->next=s;
  } 
 }
 return head;
}
//(7) 利用上题算法建立两个非递减有序单向链表,然后合并成一个非递增链表;
LinkList merge(LinkList head3,LinkList head1,LinkList head2){
 LinkList r,s,k,p;
 r=head1->next;
 k=head2->next;
 head3=(LinkList)malloc(sizeof(LNode));
 head3->next=NULL;

 while(r && k){
   if(r->data>=k->data){
    s=(LinkList)malloc(sizeof(LNode));
    s->data=k->data;
    k=k->next;
   }
   else{
    s=(LinkList)malloc(sizeof(LNode));
    s->data=r->data;
    r=r->next;
   }
  s->next=head3->next;
  head3->next=s;
 }
 while(r){
  s=(LinkList)malloc(sizeof(LNode)); 
  s->data=r->data; 
  r=r->next;
  s->next=head3->next;
  head3->next=s;
 }
 while(k){
  s=(LinkList)malloc(sizeof(LNode));
  s->data=k->data;
  k=k->next;
  s->next=head3->next;
  head3->next=s;
 }
 return head3;
}

抱歉!评论已关闭.