现在的位置: 首页 > 综合 > 正文

带头节点的线性链表类型[原创]

2012年10月19日 ⁄ 综合 ⁄ 共 2940字 ⁄ 字号 评论关闭
  1/*========带头节点的线性链表类型=========*/
  2/*=======================================*/
  3
  4
  5/*===============包含头文件以及类型定义==============*/
  6#include <stdio.h>
  7#include <malloc.h>
  8#define NULL 0
  9#define NODE_NUM 10
 10
 11
 12typedef struct lnode{
 13    char data;
 14    struct lnode *next;
 15}
*link,*position;
 16
 17
 18typedef struct{
 19    link head,tail;
 20    int len;
 21}
linklist;
 22
 23
 24/*======================================================*/
 25/*=======一些在其他函数定义中会调用的函数===============*/
 26/*======================================================*/
 27
 28int compare(char a,char b){  /*---compare---比较两个元素的大小关系*/
 29    return a-b;
 30}

 31
 32
 33int visit(link p){
 34    if(p->data>=65&&p->data<=97)/*---visit---判断结点的元素是否为大写元素*/
 35        return 1;
 36    else
 37        return 0;
 38
 39}

 40
 41
 42int length(link s)/*---length---求链的长度*/
 43    int i=0;/*i不赋初值,编译错误“可能在i定义以前使用了它在length函数中”*/
 44    link p=NULL;
 45    p=s;
 46    while(p->next!=NULL){
 47        p=p->next;
 48        i++;
 49    }

 50    return i;
 51}

 52
 53
 54void print(linklist l){     /*---print---在屏幕上输出链表的所有元素*/
 55    link p=NULL;
 56    p=l.head;
 57    if(!p->next){
 58        printf("\nThe linklist is empty.\n\n");
 59        return ;
 60    }

 61    printf("The list:");
 62    while(p){
 63        printf("%c-",p->data);
 64        p=p->next;
 65    }

 66}

 67
 68
 69
 70/*======================================================*/
 71/*==========对带头结点的单链线性表进行操作的函数的定义==================*/
 72/*======================================================*/
 73
 74position makenode(char e){       /*---分配由p指向的结点并赋值为e---*/
 75    link p=NULL;
 76    p=(link)malloc(sizeof(struct lnode));
 77        /*---struct lnode 才能表示一个结构体类型并可用于分配空间的元素类型定义-*/
 78    if(p){
 79        p->data=e;
 80        p->next=NULL;
 81    }

 82    else return;
 83    return p;
 84}

 85
 86
 87void freenode(link p){          /*---释放p所指向的结点-*/
 88    free(p);
 89}

 90
 91
 92
 93int initlist(linklist *l){      /*---构造一个由l指向的空的线性表-*/
 94    l->head=makenode('L');
 95    l->head->next=NULL;/*不是l->head=NULL*/
 96    l->tail=l->head;
 97    l->len=0;
 98    return 1;
 99}

100
101
102position priorpos(linklist l,link p){    /*---返回p所指结点的直接前驱的位置-*/
103    link q;
104    q=l.head;
105    if(q->next==p) return 0;
106    while(q->next!=p)   q=q->next;
107    return q;
108}

109
110
111int insfirst(linklist *l,link s){    /*---将s指向的结点插入线性链表的第一个结点之前-*/
112    s->next=l->head->next;
113    if(!l->head->next) l->tail=s;/*当向一个空的线性表执行该操作时*/
114    l->head->next=s;
115    l->len++;
116
117}

118
119
120int append(linklist *l,link s){  /*---将指针s所的一串结点链接在线性表L的最后一个结点-*/
121    link q;
122    q=l->head;
123    if(!l->tail){/*考虑到链表为空的情况*/
124        l->head->next=s;
125        while(q->next) q=q->next;/*尾结点的处理*/
126        l->tail=q;
127    }

128    l->tail->next=q=s;
129    while(q->next) q=q->next;/*不能忘了对尾结点的处理*/
130    l->tail=q;
131    l->len+=length(s);
132
133}

134
135

抱歉!评论已关闭.