Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > C数据结构_带头接点的单链表的实现
【标  题】:C数据结构_带头接点的单链表的实现
【关键字】:
【来  源】:http://www.cublog.cn/u/17227/showart.php?id=232260

C数据结构_带头接点的单链表的实现

Your Ad Here /************************************
单链表实现
链表带有头节点
在VC6 中调试成功
vincent
2007-01-08
*************************************/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE            1
#define FALSE           0
#define OK              1
#define ERROR           0
#define INFEASIBLE      -1
#define OVERFLOW        -2

typedef int ElemType;
typedef int Status;



/*申明结构,节点*/
typedef struct LNode{
    ElemType   data;
    LNode      *next;
}LNode,*LinkList;


/*定义一个函数指针在LocateElem作为函数参数使用*/
typedef Status (*cmp)(LNode* i,  LNode* x);
typedef void (*vis)( LNode* N);


/*创建LinkList,注意结构作为函数参数时的特别之处,头节点中的data放置链表长度(元素个数)*/
LinkList InitList();
LinkList InitList(int i);

/*销毁LinkList,注意要销毁整个链表*/
Status DestroyList(LinkList L);

/*将元素插入链表指定位置*/
Status InsertList(LinkList L, int i, ElemType e);

/*删除链表中的指定元素*/
Status DeletList(LinkList L, int i);

/*获取链表中指定位置的元素:注意链表中的元素就是它的节点*/
LNode* GetElem(LinkList L, int i);

/*获取链表长度,因为头节点data记录即其长度,但是这样的结构在非int类型的data中有问题*/
int ListLength(LinkList L);

/*定位元素位置*/
int LocateElem(LinkList L,LNode* N, cmp f);

/*前一个元素*/
LNode* PriorElem(LinkList L);

/*后一个元素*/
LNode* NextElem(LinkList L);

/*遍历链表*/
void ListTraverse(LinkList L, vis v);

/*比较2个节点是否相同*/
Status Compare(LNode* i, LNode* x);

/*visit 节点*/
void Visit(LNode* N);



/*主程序*/
void main(){
    printf("单链表实现,头节点存放链表长度\n");
    printf("首先生成一个含5个节点的单链表\n");
    int i ;
    LinkList L = InitList(5);
    /*注意这里函数指针的用法*/
    vis v = Visit;
    ListTraverse(L,v);
    DestroyList(L);

        
   

     

   
}


/*创建LinkList,注意结构作为函数参数时的特别之处,头节点中的data放置链表长度(元素个数)*/
LinkList InitList( ){
    LinkList L = (LinkList) malloc(sizeof(LNode));
    if (!L) exit(OVERFLOW);
    L->data = 0;
    L->next = NULL;
    return L;
}

LinkList InitList(int i){
    int t ;
   
    LinkList L =  (LinkList)malloc(sizeof(LNode));
    if (!L) exit(OVERFLOW);   
    L->data = 0;
    L->next = NULL;
    for(t = 0; t < i ; t++){
        LinkList P = (LinkList)malloc(sizeof(LNode));
        if(!P) exit(OVERFLOW);
        scanf("%d",&P->data);
        P->next = L->next;
        L->next = P;       
        ++L->data;
    }

    return L;
}


/*销毁LinkList,注意要销毁整个链表*/
Status DestroyList(LinkList L){
    int length = 0;
    LinkList t = L;
    LinkList p = L;
   
    if (!L) exit(ERROR);
    if (!L->next){
        free(L);
        L = NULL;
        return OK;
    }
    t = L->next;
    while(t->next){
        p = t->next;
        free(t);
        t = p;
    }
    t = NULL;
    p = NULL;
    free(L);
    L = NULL;
    return OK;
}

/*将元素插入链表指定位置之后*/
Status InsertList(LinkList L, int i, ElemType e){
    int j;
    if(!L) exit(ERROR);
    if(i > L->data) exit(ERROR);
    LinkList p = (LinkList) malloc(sizeof(LNode));
    LinkList t = L;
    if(!p) exit(OVERFLOW);
    p->data = e;

    for(j = 0; j < i; j++){
        t = t->next;       
    }
    p->next = t->next;
    t->next = p;
    ++L->data;
    return OK;
}

/*删除链表中的指定位置的元素*/
Status DeletList(LinkList L, int i){
    int j ;
    LinkList &t = L;
    if(!L) exit(ERROR);
    if(i > L->data || i < 1) exit(ERROR);
    for(j = 0; j < i; j++){
        t = t->next;       
    }
    LinkList &p = t;
    p = p->next;
    t->next = p->next;
    free(p);
    --L->data;
    return OK;
   
}

/*获取链表中指定位置的元素:注意链表中的元素就是它的节点*/
LNode* GetElem(LinkList L, int i){
    int j ;
    LNode* N;
    LinkList &t = L;
    if(!L) exit(ERROR);
    if( i< 1 || i > L->data) exit(ERROR);
    for(j = 0; j <= i; j++){
        t = t->next;
    }
    N = (LNode*) t;
    return N;
   
}

/*获取链表长度,因为头节点data记录即其长度,但是这样的结构在非int类型的data中有问题*/
int ListLength(LinkList L){
    if(!L) exit(ERROR);
    return L->data;
}

/*定位元素位置*/
int LocateElem(LinkList L,LNode* N, cmp f){
    LNode* t;
    if(!L)exit(ERROR);
    LinkList &p = L->next;
    int j;
    for(j = 1; j <= L->data; j++){
        t = (LNode*)p;
        if(f(N,t)) return j;
        p = p->next;
    }
    return 0;   
}


/*比较2个节点是否相同*/
Status Compare(LNode* i, LNode* x){
    if(!i || !x)exit(ERROR);
    if(i->data == x->data)return(TRUE);
    return FALSE;
}

/*前一个元素*/
LNode* PriorElem(LinkList L){
    /*在单链表中实现查找前一个元素的算法基本不可能,在此不实现*/
    return 0;
}

/*后一个元素*/
LNode* NextElem(LinkList L){
    if(!L || !L->next)exit(ERROR);
    return (LNode*)L->next;
}

/*遍历链表*/
void ListTraverse(LinkList L, vis v){
    if(!L)exit(ERROR);
    /*L 为单链表的头节点*/
    L = L->next;
    while(L){
        (LNode*)L;       
        v(L);
        L = L->next;
    }
}

/*visit 节点*/
void Visit(LNode* N){
    if(!N)exit(ERROR);
    printf("%d\n",N->data);
}
 
如何设置socket的Connect超时(linux):【上一篇】
Redhat Enterprise Linux 4 下的GCC安装顺序:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • PHP的FDF文档支持
  • 微软推出SQL 2005积累补丁
  • 跟我学做最强功能的网站统计
  • Linux侵犯了微软知识产权?
  • Blend after Texture Shader
  • jsp下word显示和读取
  • Php 生成静态html文件
  • 登录环境
  • Struts运行时出现的问题及解决办法
  • 电子打印(ePlot)与批处理打印
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.