链表操作

/************************************************************************************************************
**File:   list.c
**Author:       Freeking
**Created:      Sep 13th 2009
**Description:  关于链表的各种操作,包括创建链表,输出链表,插入链表,链表长度,定位链表元素(值或位置),
               删除指定元素,删除链表,逆序输出链表等操作
***********************************************************************************************************/
#include<stdio.h>
#include<malloc.h>

typedef struct node{
        int data;
        struct node* next;

}LNode,*Linklist;

//创建一个空连
Linklist Create_Linklist()
{
        Linklist Head;
        Head = (Linklist)malloc( sizeof(LNode) );
        if( Head )
        {
                Head->next = NULL;
        }
        return Head;
}

//创建一个长度为n的线性链表
void Create_Linklist_L( LNode *head, int n)
{
      LNode *p, *q;
        int i;
        p = head;
        for(i=1; i<=n; i++)
        {
                q=(Linklist)malloc(sizeof(LNode) );
                printf("data%d:", i);
                scanf("%d", &q->data);
                q->next = NULL;
                p->next = q;
                p = q;
        }
}

//输出链表
int print_Linklist( Linklist Headdress )
{
        Linklist p;
        if( !(Headdress) )
        {
   printf("链表错误!");
            return -1 ;
        }
        p = Headdress;
        while( NULL != p->next )
        {
                p = p->next;
                printf("%d,", p->data);
        }
        return 0;
}

//求链表的长度
int Lenght_Linklist(Linklist H)
{
        Linklist p = H;
        int count = -1;
        while( p )
        {
                p = p->next;
                count++;
        }
        printf("The lenght of the list is:%d/n",count);
        return count;
}

//查找第i个结点
Linklist Locate_Linklist_P( Linklist H, int i )
{
        Linklist p = H;
        int j = 0;
        while( p&&j < i )
        {
                p = p->next;//查找第i个结点
                j++;
        }
        if( j!= i || !p )
        {
                printf("参数 i 错或者单连表不存在!/n");
        }
        return p;
}
//按值查找第一个在链表中出现的值
Linklist Locate_Linklist_V( Linklist H, int x)
{
        Linklist p = H->next;
        while( p&&(p->data != x))
        {
                p = p->next;
        }
        return p;
}
//在指定的位置插入一个结点
int Insert_Linklist( Linklist H, int i, int data)
{
        Linklist p, q;
        p = Locate_Linklist_P(H, i-1);
        if( !p )
        {
                printf("i error! /n");
                return 0;
        }
        q = (Linklist)malloc(sizeof(LNode));
        if( !q )
        {
                printf(" malloc error!/n" );
                return -1;
        }
        q->data = data;
        q->next = p->next;
        p->next = q;
        return 2;
}
//删除链表
Linklist Destroy_Linklist( Linklist H )
{
        Linklist p;
        Linklist q;
        if(!H)
        {
                printf( " this is a empty list. error!/n");
    return NULL;
        }
        p = H;
        while( NULL != p )
        {
                q = p;
                p = p->next;
                free(p);
        }
        H = NULL;
  return H;
}

//删除一个指定结点
Linklist  Del_Linklist( Linklist H, int i )
{
        Linklist p ,q;
        if( !H->next )
        {
                printf( " this is a empty list. error!/n");
        }
     p = Locate_Linklist_P( H, i-1 );
  q = p->next;
  p->next = q->next;
  free(q);
 return H;
}
//单链表就地逆置
Linklist Reverselist( Linklist H )
{
      Linklist p, q;
     if(H->next && H->next->next )
     {
                p = H->next;
                q = p->next;
                p->next = NULL;
                while( q )
               {
                        p = q;
                        q = q->next;
                        p->next = H->next;
                        H->next = p;
                }
         return H;
        }
     return H;
}
int main()
{
        Linklist Header;
        Linklist p;
        int i;
  int data;
        printf("Please input the number of the data:i=");
        scanf("%d",&i);

        Header = Create_Linklist();
        Create_Linklist_L(Header,i);

        Lenght_Linklist(Header);
  printf("链表中的元素分别为:");
        print_Linklist(Header);//输出链表

  printf("/n请输入要查找的是第?个链表元素:");
        scanf("%d",&i);
  if( (p = Locate_Linklist_P( Header, i)) )
  {
   printf("第%d个链表元素值为:%d/n/n",  i, p->data );
  }

  printf("请输入要查找的元素是否在链表中:");
        scanf("%d",&i);
  if( (p = Locate_Linklist_V( Header, i )) )
  {
   printf("值为:%d的元素在链表中/n/n ", p->data );
  }
  
  printf("请输入要在第?个的元素前插入值为?元素到链表中:");
        scanf("%d%d", &i, &data);
        Insert_Linklist(Header, i, data);
        print_Linklist(Header);//输出链表

  printf("/n请输入要删除的是第?个链表元素:");
        scanf("%d",&i);
  Del_Linklist(Header, i );
        print_Linklist(Header);//输出链表
  
  printf("/n逆序链表的输出为:"); 
  Reverselist(Header);
        print_Linklist(Header);//输出链表

       if(!(p = Destroy_Linklist(Header )) )
  {
   printf("/n");
         print_Linklist(p);//输出链表
  }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值