数据结构——单向链表的链式存储及实现

#include<iostream>
#include<cstdlib>
#include<cstdio>

using namespace std;
typedef int ElemType;
typedef struct Node
 {
   ElemType data;
   struct Node *next;
 }Node,*LinkList;
 LinkList create()//创建链表
  {
      LinkList p,q,h;
      ElemType x;
      h=(Node *)malloc(sizeof(Node));
      p=h;
      printf("enter x:\n");
      scanf("%d",&x);
      while(x!=0)
       {  q=(Node *)malloc(sizeof(Node));
          q->data=x;
          p->next=q;
          p=q;
          scanf("%d",&x);
       }
      p->next=NULL;
      return h;
  }
  void list_display(LinkList h)//遍历
  {
      LinkList p;
     p=h->next;

     while(p!=NULL)
     {
         printf("%d  ",p->data);
         p=p->next;
     }
     cout<<endl;
  }

   int LinkListDelete(LinkList h,int i,int *e)//删除
{
    LinkList p,q;
    p=h;
    q=h->next;
    int j=1;
    while(q!=NULL&&j<i)
     {
      j++;
      p=q;
      q=q->next;
      }
    if(i==j&&q!=NULL)
    {
    p->next=q->next;
     *e=q->data;
     free(q);
     return 1;
    }
    else
     return 0;
}
int LinkListInsert(LinkList h,int i,ElemType e)//插入
{
    LinkList p,q;
    p=h;
    int j=0;
   while(j<(i-1)&&p->next!=NULL)
   {
       j++;
       p=p->next;
   }
  if(j==i-1&&p->next!=NULL)
  {
      q=(Node *)malloc(sizeof(Node));
      if(q==NULL)
       return 0;
      q->data=e;
      q->next=p->next;
      p->next=q;
       return 1;
  }
  else
     return 0;
}
LinkList linklistni(LinkList h)//逆置
   {

     LinkList p,q;
  if (h==NULL)
   {
      printf("链表空!\n");
      return h;
    }
     p=h->next; q=p->next;
     p->next=NULL;
  while(q!=NULL)
  {     p=q;
      q=p->next;
      p->next=h->next;
      h->next=p;

  }

  return h;
   }
LinkList deleteeven(LinkList h)//删除偶数
 {
     LinkList p,q;
     p=h->next;
     q=h->next;
     int i=1,t,s;
     while(q!=NULL)
     {
        if(q->data%2==0)
          {
            p->next=q->next;
             free(q);
          }
        else
         p=q;

          q=p->next;
     }
    return h;

   }
   void init()
   {
       printf("*********菜单*********\n");
   printf("1.创建一个新链表\n");
   printf("2.遍历链表\n");
   printf("3.删除链表中的元素\n");
   printf("4.插入链表中一个元素\n");
   printf("5.对链表中的元素逆置\n");
   printf("6.删除链表中的偶数\n");
   }

int main()
 {
   init();
    LinkList list;int n,t,i;
  while(~scanf("%d",&n))
  {
    switch(n)
   {
    case 1:list=create();break;
    case 2:list_display(list);break;
    case 3:printf("输入要删除第几个\n");
         scanf("%d",&i);
         if(LinkListDelete(list,i,&t))
            printf("删除成功\n");
         else
            printf("删除失败\n");
            break;
    case 4:printf("输入插入的元素的位置:");
           scanf("%d",&i);
           printf("输入插入的元素:");
           scanf("%d",&t);
         if(LinkListInsert(list,i,t))
           {
                printf("插入成功,插入后结果为:\n");
                list_display(list);
           }
        else
           printf("插入失败\n"); break;

    case 5:list=linklistni(list);
           printf("逆置结果为:\n");
           list_display(list);break;
    case 6:
           list=deleteeven(list);
           printf("删除结果为:\n");
           list_display(list);
            break;
  }
  }
     return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值