单链表实现!

来源:互联网 发布:openwrt 安装软件 编辑:程序博客网 时间:2024/05/18 00:58

linklist.h

#ifndef LINKLIST_H_INCLUDED#define LINKLIST_H_INCLUDEDtypedef  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;}
个别地方还不是太完整。

原创粉丝点击