单链表的建立、插入、删除等简单操作

#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node/*单链表结构体的定义*/
{
 elemtype data;
 struct node *next;
}
node,*linklist;


void main_menu();/*主菜单函数*/
node* creatfromhead();/*从头结点插入建立单链表*/
node* get(linklist l);/*单链表的遍历*/
node* reverselist(linklist l);/*将带头结点的单链表逆置*/
node* creatfeidijian();/*头插法建立非递减单链表*/
node* combine(linklist la,linklist lb);/*将两个非递减链表合成一个非递减连表*/
node* inslist(linklist l,elemtype e);/*在非递减有序链表中插入一个元素使链表仍然有序*/
node* deletelist(linklist l,elemtype *x);/*在非递减单链表中删除值为x的结点*/


int main()/*主函数*/
{
 int input;                                                                                                                                                                                                                                                                                                                  
    main_menu();
 return 0;
}


void main_menu()/*主菜单函数*/
{
 int input;
 printf("\t\t\t单链表的建立及其简单操作\t\t\n\n");
 printf("\t\t 1 从头结点插入建立单链表\n");
 printf("\t\t 2 单链表的遍历\n");
 printf("\t\t 3 将带头结点的单链表逆置\n");
 printf("\t\t 4 头插法建立非递减单链表\n");
 printf("\t\t 5 将两个非递减链表合成一个非递减连表\n");
 printf("\t\t 6 在非递减有序链表中插入一个元素使链表仍然有序\n");
 printf("\t\t 7 在非递减单链表中删除值为x的结点\n");
 printf("\t\t 0 退出\n");
 printf("\t\t注意事项:初始化单链表的时候以“0”结束初始化!!!!\n");
 printf("请输入需要操作的项目序号:");
 scanf("%d",&input);
 switch(input)
 {
 case 1:{
  node* head;
  printf("请输入一个单链表用“0”来结束输入:");
  head=creatfromhead();
  printf("初始化后的单链表为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 2:{
  node* head;
  printf("请首先输入一个单链表用“0”来结束输入:");
  head=creatfromhead();
  printf("单链表的遍历结果为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 3:{
  node* head;
  printf("请输入需要逆置的单链表:");
  head=creatfromhead();
  printf("初始化后的单链表为:");
  get(head);
  printf("单链表的逆置结果为:");
  head=reverselist(head);
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 4:{
  node* head;
  printf("请输入一个非递减单链表序列:");
  head=creatfromhead();
  printf("初始化后的单链表为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 5:{
  node* la,*lb,*head;
  printf("请输入非递减的单链表la:");
  la=creatfromhead();
  printf("单链表la为:");
  get(la);
  printf("请输入非递减的单链表lb:");
  lb=creatfromhead();
  printf("单链表lb为:");
  get(lb);
  head=combine(la,lb);
  printf("合并之后的新的单链表为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 6:{
  node* head;elemtype e;
  printf("请输入一个非递减单链表序列:");
  head=creatfromhead();
  printf("初始化后的单链表为:");
  get(head);
  printf("请输入一个需要插入的元素:");
  scanf("%d",&e);
  head=inslist(head,e);
  printf("插入之后的单链表为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
 case 7:{
  node* head;elemtype e;
  printf("请输入一个非递减单链表序列:");
  head=creatfromhead();
  printf("初始化后的单链表为:");
  get(head);
  printf("请输入一个需要删除的元素:");
     scanf("%d",&e);
  head=deletelist(head,e);
  printf("删除之后的单链表为:");
  get(head);
  printf("\n\n");
  main_menu();
  break;
     }
     case 0:
     {
       exit(0);break;
     }
 }
}


node* creatfromhead()/*头插法建立单链表*/
{
 linklist l;
 node *s;
 int c;
 int flag=1;
 l=(node*)malloc(sizeof(node));
 if(l==NULL)
 {
  printf("申请空间失败!!");
        return 0;
 }
 l->next=NULL;
 while(flag)
 {
  scanf("%d",&c);
  if(c!=0)
  {
   s=(node*)malloc(sizeof(node));
    if(s==NULL)
    {
              printf("申请空间失败!!");
     return 0;
    }
   s->data=c;
   s->next=l->next ;
   l->next=s;
  }
  else flag=0;
 }
 return l;
}


node* get(linklist l)/*单链表的遍历*/
{
 node *p;
 p=l->next;
 while(p!=NULL)
 {
  printf("%d ",p->data);
        p=p->next;
 }
 printf("\n");
}



node* reverselist(linklist l)/*将带头结点的单链表逆置*/
{
    node *q,*p;
    p=l->next;
    l->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        p->next=l->next;
        l->next=p;
        p=q;
    }
 return l;
}



node* creatfeidijian()/*头插法建立非递减单链表*/
{
 linklist l;
 node *s;
 int c;
 int flag=1;
 printf("%s","请输入一个非递减数列!!");
 l=(node*)malloc(sizeof(node));
 if(l==NULL)
 {
  printf("申请空间失败!!");
        return 0;
 }
 l->next=NULL;
 while(flag)
 {
  scanf("%d",&c);
  if(c!=0)
  {
    s=(node*)malloc(sizeof(node));
    if(s==NULL)
    {
              printf("申请空间失败!!");
     return 0;
    }
       s->data=c;
       s->next=l->next ;
       l->next=s;
  }
  else flag=0;
 }
 return l;
}


node* combine(linklist la,linklist lb)
/*将两个非递减链表合成一个非递减连表*/
{
 node *pa,*pb,*r;
 linklist lc;
 pa=la->next;
 pb=lb->next;
 lc=la;
 lc->next=NULL;r=lc;
 while(pa!=NULL&&pb!=NULL)
 {
  if(pa->data<=pb->data)
  {
   r->next=pa;r=pa;pa=pa->next;
  }
  else
  {
            r->next=pb;r=pb;pb=pb->next;
  }
 }
  if(pa)
   r->next=pa;
  else
   r->next=pb;
  free(lb);
  return(lc);
}


node *inslist(linklist l,elemtype e)
/*在非递减有序链表中插入一个元素使链表仍然有序*/
{
 node *s,*p;
 p=l;
 while(l!=NULL)
 {
  if(e>=l->data&&e<=l->next->data)
  {
   s=(node*)malloc(sizeof(node));
   s->data=e;
   s->next=l->next;
   l->next=s;
   break;
  }
  else
   l=l->next;
 }
 return p;
}
node * deletelist(linklist l,elemtype x)
/*在非递减单链表中删除值为x的结点*/
{
 node *p,*r,*q;
 p=l->next;q=l;
 while(p!=NULL)
 {
  if(p->data==x)
  {
   r=p;
   p=r->next;
   q->next=p;
   free(r);
   break;
  }
  else
  {
   q=p;/*保留前驱节点*/
      p=p->next;
  }
 }
 if(p==NULL)
      printf("删除失败,没有找到相应的元素\n");
 return l;
}


你可能感兴趣的:(单链表的建立、插入、删除等简单操作)