关闭

单链表实现!

450人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67494次
    • 积分:1442
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:22篇
    • 译文:0篇
    • 评论:12条
    最新评论