单链表实现!

linklist.h

#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

typedef  int  ElementType;

struct  linklist;
typedef  struct  linklist  *LinkList;
typedef  LinkList  Position;

/**< 函数如无返回值,且须改变参数值时,课使用二级指针 */
/**< 有返回值使用以及指针即可,传值调用即体现在此,指针亦不例外 */
LinkList  CreatLinkList(LinkList L,int N);  /**< 创建链表,长度为N,函数如无返回值参数需用二级指针 */
void  PrintLinkList(LinkList  L);       /**< 打印链表 */
LinkList  DeleteLinkList(LinkList  L);    /**< 销毁整表 */
int  IsEmpty(LinkList  L);                   /**< 表是否为空 */
int  IsLast(Position  P, LinkList  L);   /**< 位置P是否为最后 */
Position  Find(ElementType  X, LinkList  L);   /**< 查找元素X的位置 */
Position  FindPrevious(ElementType  X, LinkList  L);  /**< 查找元素X之前的位置 */

LinkList  Delete(ElementType  X, LinkList  L);   /**< 删除元素X */
LinkList  Insert(ElementType  X, LinkList  L);    /**< 插入元素X */
#endif // LINKLIST_H_INCLUDED

linklist.c

#include  <stdio.h>
#include  <malloc.h>
#include  <time.h>
#include  <math.h>
#include  <io.h>
#include  "linklist.h"

struct  linklist
{
    ElementType  data;
    LinkList  next;
};
 /**< 创建链表 */
LinkList  CreatLinkList(LinkList  L,int  n)
{
    LinkList  P;
    int i;

    L=(LinkList)malloc(sizeof(struct linklist));
    if(L==NULL)
        printf("out of  space!!!");
    L->next =NULL;

    for(i=0;i < n;i++)
    {
        P=(LinkList)malloc(sizeof(struct linklist));
        P->data=rand()%100+1;
        P->next =L->next;
        L->next =P;
    }

    return L;

}

  /**< 打印链表 */
void  PrintLinkList(LinkList  L)
{
    Position  P;
    P=L->next;
    while(P!=NULL)
    {
        printf("%d\t",P->data);
        P=P->next;
    }
}

/**< 销毁整表 */
LinkList  DeleteLinkList(LinkList  L)
{
    LinkList  temp,P;
    P=L->next;

    while(P)
    {
        temp=P->next;   /**< temp=P;free(P);P=temp->next; this is wrong,  temp must  point to the next  node*/
        free(P);
        P=temp;
    }

    L->next =NULL;

    return L;
}

                  /**< 表是否为空 */
int  IsEmpty(LinkList  L)
{
    return  L->next==NULL;
}

   /**< 位置P是否为最后 */
int  IsLast(Position  P, LinkList  L)
{
    return  P->next ==NULL;
}

  /**< 查找元素X的位置 */
Position  Find(ElementType  X, LinkList  L)
{
    LinkList  P;
    P=L->next;

    while(P != NULL  && P->data !=X)
    {
        P=P->next;
    }

    return  P;
}

 /**< 查找元素X之前的位置 */
Position  FindPrevious(ElementType  X, LinkList  L)
{
    LinkList  P;
    P=L;       /**< P=L->next;如此写不能正确删除首位数据 */

    while(P ->next!= NULL  && P->next->data !=X)
    {
        P=P->next;
    }

    return  P;
}

 /**< 删除元素X */
LinkList  Delete(ElementType  X, LinkList  L)
{
    Position  P,temp;
    P=FindPrevious(X,L);
    temp=P->next;
    P->next =temp->next;
    free(temp);

    return  L;
}

    /**< 插入元素X */
LinkList  Insert(ElementType  X, LinkList  L)
{
    Position  P,temp;

    temp=(LinkList)malloc(sizeof(struct linklist));
    P=L->next;
    temp->data =X;
    temp->next=P;
    L->next =temp;

    return  L;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  "linklist.c"


int main()
{
    LinkList  L;
    L=(LinkList)malloc(sizeof(struct linklist));
    L=CreatLinkList(L,12);
    PrintLinkList(L);
    putchar(10);   /**< printf('\n');这一句为何会警告? */
    printf("\n");     /**< 该函数参数为指针,需用双引号 */

    L=Delete(46,L);
    PrintLinkList(L);
    putchar(10);

    L=Insert(17,L);
    PrintLinkList(L);

    DeleteLinkList(  L);
    getchar();
    return 0;
}
个别地方还不是太完整。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值