单链表

/**
 * 单链表
 **/
#include <stdlib.h>
#include <iostream.h>

#define OK 1
#define ERROR 0

//结点类型
typedef struct node{
    int item;
    struct node *next;
}NODE;

//链表类型
typedef struct{
    NODE *head;
}LINK_LIST;

//初始化单链表
int init(LINK_LIST *L)
{
    L->head=(NODE*)malloc(sizeof(NODE));
    //为头结点分配存储单元
    if (L->head)
    {
        L->head->next=NULL;
        return OK;
    }
    else
        return ERROR;
}

//销毁链表L 
void destory(LINK_LIST *L)
{
    NODE *p;
    while (L->head){             //依次删除链表中的所有结点
        p=L->head;  
        L->head=L->head->next;
        free(p);
    }
}

//清空单链表
void clear(LINK_LIST *L)
{
    NODE *p;
    while (L->head->next){
        p=L->head->next;            //p指向链表中头结点后面的第一个结点
        L->head->next=p->next;        //删除p结点
        free(p);                    //释放p结点占据的存储空间
   }
}

//链表长度
int length(LINK_LIST L)
{
    NODE *p = L.head;
    int len;
    for(p=L.head,len=0; p->next!=NULL; p=p->next,len++);
    return(len);
}

//判断是否为空
int isEmpty(LINK_LIST L) 
{
     if(L.head->next==NULL) 
         return 1;
     else 
         return 0;
}

//通过e返回链表L中第i个数据元素的内容
void getElem(LINK_LIST L,int i,int *e)  
{
    NODE *p;
    int j;
    if (i<1||i>length(L)) exit(0);
    //检测i值的合理性
    for (p=L.head,j=0; j!=i; p=p->next,j++);
    //找到第i个结点
    *e=p->item;          
    //将第i个结点的内容赋给e指针所指向的存储单元中
}

//在链表L中检索值为e的数据元素
NODE *locateELem(LINK_LIST L,int e)
{
    NODE *p;
    for(p=L.head->next;p&&p->item!=e;p=p->next); 
    //寻找满足条件的结点
    return(p);
}

//返回链表L中结点e的直接前驱结点
NODE *PriorElem(LINK_LIST L,NODE *e)
{
    NODE *p;
    if (L.head->next==e) return NULL;        
    //检测第一个结点
    for (p=L.head;p->next&&p->next!=e;p=p->next);     
    if (p->next==e) return p;
    else return NULL;
}

//返回链表L中结点e的直接后继结点
NODE *NextElem(LINK_LIST L,NODE *e)
{
    NODE *p;
    for(p=L.head->next;p&&p!=e;p=p->next);
    if (p) p=p->next;  
    return p;
}

//在链表L中第i个数据元素之前插入数据元素e   
int insertList(LINK_LIST *L,int i,int e)       
{
    NODE *p,*s;
    int j;
    if (i<1||i>length(*L)+1) return ERROR;
    s=(NODE*)malloc(sizeof(NODE));
    if (s==NULL) return ERROR;
    s->item=e;
    for (p=L->head,j=0;p&&j<i-1;p=p->next,j++); 
    //寻找第i-1个结点
    s->next=p->next;  p->next=s;      //将s结点插入
    return OK;
}

//将链表L中第i个数据元素删除,并将其内容保存在e中。
int deleteList(LINK_LIST *L,int i,int *e)
{
    NODE *p,*s;
    int j;
    if (i<1||i>length(*L)) return ERROR;    
    //检查i值的合理性
    for(p=L->head,j=0;j<i-1;p=p->next,j++);   
    //寻找第i-1个结点
    s=p->next;           //用s指向将要删除的结点
    *e=s->item;          
    p->next=s->next;      //删除s指针所指向的结点
    free(s);
    return OK;
}

//插入链表
void insert(LINK_LIST *L)
{
    cout<<"请依次递增输入这5个数据:"<<endl;
    NODE *head = L->head;
    for(int i=0;i<5;i++)
    {
        NODE* node = (NODE*)malloc(sizeof(NODE));
        cin>>node->item;
        node->next = NULL;
        head->next = node;
        head = node;
    }
}

//输出单链表
void print(LINK_LIST L)
{
    NODE* head = L.head->next;
    while(head != NULL)
    {
        cout<<head->item<<"  ";
        head = head->next;
    }
    cout<<endl;
}

 

posted @ 2013-02-23 17:53  何长春  阅读(161)  评论(0编辑  收藏  举报