链表的操作(纯C语言版)

来源:互联网 发布:plc模拟量编程实例 编辑:程序博客网 时间:2024/06/05 16:18
[cpp] view plain copy
 print?
  1. #include "stdafx.h"  
  2. #include "stdio.h"  
  3. #include "stdlib.h"  
  4. #include "time.h"  
  5.   
  6. #define OK     (1)  
  7. #define ERROR  (0)  
  8. #define TRUE   (1)  
  9. #define FALSE  (0)  
  10.   
  11. #define MAXSIZE 20 /* 存储空间初始分配量 */  
  12.   
  13. typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */  
  14. typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */  
  15.   
  16.   
  17. Status visit(ElemType c)  
  18. {  
  19.     printf("%d ",c);  
  20.     return OK;  
  21. }  
  22.   
  23. typedef struct Node  
  24. {  
  25.     ElemType data;  
  26.     struct Node *next;  
  27. }Node;  
  28.   
  29. typedef struct Node *LinkList; /* 定义LinkList */  
  30.   
  31. /* 初始化顺序线性表 */  
  32. Status InitList(LinkList *L)   
  33. {   
  34.     *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */  
  35.     if(!(*L)) /* 存储分配失败 */  
  36.     {  
  37.         return ERROR;  
  38.     }  
  39.     (*L)->next=NULL; /* 指针域为空 */  
  40.   
  41.     return OK;  
  42. }  
  43.   
  44. /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */  
  45. Status IsEmptyList(LinkList L)  
  46. {   
  47.     if(L->next)  
  48.     {  
  49.         return FALSE;  
  50.     }  
  51.     else  
  52.     {  
  53.         return TRUE;  
  54.     }  
  55. }  
  56.   
  57. /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */  
  58. Status ClearList(LinkList *L)  
  59. {   
  60.     LinkList p,q;  
  61.     p=(*L)->next;           /*  p指向第一个结点 */  
  62.     while(p)                /*  没到表尾 */  
  63.     {  
  64.         q = p->next;  
  65.         free(p);  
  66.         p = q;                /* update operated node */  
  67.     }  
  68.     (*L)->next = NULL;        /* 头结点指针域为空 */  
  69.     return OK;  
  70. }  
  71.   
  72. /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */  
  73. int GetListLength(LinkList L)  
  74. {  
  75.     int i = 0;  
  76.     LinkList p = L->next; /* p指向第一个结点 */  
  77.     while(p)                          
  78.     {  
  79.         i++;  
  80.         p = p->next;  
  81.     }  
  82.     return i;  
  83. }  
  84.   
  85. /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */  
  86. /* 操作结果:用e返回L中第i个数据元素的值 */  
  87. Status GetElem(LinkList L,int i,ElemType *pElem)  
  88. {  
  89.     int j = 1;            /*  j为计数器 */  
  90.     LinkList p;           /* 声明一结点p */  
  91.     p = L->next;          /* 让p指向链表L的第一个结点 */  
  92.     while ((p != NULL) && (j < i))  /* p不为空或者计数器j还没有等于i时,循环继续 */  
  93.     {     
  94.         p = p->next;      /* 让p指向下一个结点 */  
  95.         ++j;  
  96.     }  
  97.     if ((!p) || (j > i))   
  98.     {  
  99.         return ERROR;    /*  第i个元素不存在 */  
  100.     }  
  101.     *pElem = p->data;    /*  取第i个元素的数据 */  
  102.     return OK;  
  103. }  
  104.   
  105. /* 初始条件:顺序线性表L已存在 */  
  106. /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */  
  107. /* 若这样的数据元素不存在,则返回值为0 */  
  108. int GetLocationForElem(LinkList L, ElemType e)  
  109. {  
  110.     int i = 0;  
  111.     LinkList p = L->next;  
  112.     while(p)  
  113.     {  
  114.         i++;  
  115.         if(p->data == e)                  /* 找到这样的数据元素 */  
  116.                 return i;  
  117.         p = p->next;  
  118.     }  
  119.     return 0;  
  120. }  
  121.   
  122.   
  123. /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */  
  124. /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */  
  125. Status InsertListNode(LinkList *L, int i, ElemType e)  
  126. {   
  127.     int j;  
  128.     LinkList p,s;  
  129.     p = *L;  
  130.     j = 1;  
  131.     while ((p != NULL) && (j < i))       /* 寻找第i个结点 */  
  132.     {  
  133.         p = p->next;  
  134.         ++j;  
  135.     }   
  136.     if (!p || (j > i))  
  137.     {  
  138.         return ERROR;                    /* 第i个元素不存在 */  
  139.     }  
  140.     s = (LinkList)malloc(sizeof(Node));  /*  生成新结点(C语言标准函数) */  
  141.     s->data = e;    
  142.     s->next = p->next;                   /* 将p的后继结点赋值给s的后继  */  
  143.     p->next = s;                         /* 将s赋值给p的后继 */  
  144.     return OK;  
  145. }  
  146.   
  147. /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */  
  148. /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */  
  149. Status DeleteListNode(LinkList *L, int i, ElemType *e)   
  150. {   
  151.     int j = 1;  
  152.     LinkList p,q;  
  153.     p = *L;  
  154.     while ((p->next !=NULL) && (j < i))    /* 遍历寻找第i个元素 */  
  155.     {  
  156.         p = p->next;  
  157.         ++j;  
  158.     }  
  159.     if (!(p->next) || j > i)   
  160.     {  
  161.         return ERROR;           /* 第i个元素不存在 */  
  162.     }  
  163.     q = p->next;  
  164.     p->next = q->next;          /* 将q的后继赋值给p的后继 */  
  165.     *e = q->data;               /* 将q结点中的数据给e */  
  166.     free(q);                    /* 让系统回收此结点,释放内存 */  
  167.     return OK;  
  168. }  
  169.   
  170. /* 初始条件:顺序线性表L已存在 */  
  171. /* 操作结果:依次对L的每个数据元素输出 */  
  172. Status ListTraverse(LinkList L)  
  173. {  
  174.     LinkList p=L->next;  
  175.     while(p)  
  176.     {  
  177.         visit(p->data);  
  178.         p=p->next;  
  179.     }  
  180.     printf("\n");  
  181.     return OK;  
  182. }  
  183.   
  184. /*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */  
  185. void CreateListWithHead(LinkList *L, int n)   
  186. {  
  187.     LinkList p;  
  188.     int i;  
  189.     srand(time(0));         /* 初始化随机数种子 */  
  190.     *L = (LinkList)malloc(sizeof(Node));  
  191.     (*L)->next = NULL;      /* 先建立一个带头结点的单链表 */  
  192.   
  193.     for (i=0; i<n; i++)   
  194.     {  
  195.         p = (LinkList)malloc(sizeof(Node)); /*  生成新结点 */  
  196.         p->data = (rand() % 100) + 1;       /*  随机生成100以内的数字 */  
  197.         p->next = (*L)->next;      
  198.         (*L)->next = p;                     /*  插入到表头 */  
  199.     }  
  200. }  
  201.   
  202. /*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */  
  203. void CreateListTail(LinkList *L, int n)   
  204. {  
  205.     LinkList p,r;  
  206.     int i;  
  207.     srand(time(0));                      /* 初始化随机数种子 */  
  208.     *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */  
  209.     r= *L;                               /* r为指向尾部的结点 */  
  210.     for (i=0; i<n; i++)   
  211.     {  
  212.         p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */  
  213.         p->data = (rand() % 100) + 1;     /*  随机生成100以内的数字 */  
  214.         r->next = p;                      /* 将表尾终端结点的指针指向新结点 */  
  215.         r = p;                            /* 将当前的新结点定义为表尾终端结点 */  
  216.     }  
  217.     r->next = NULL;                       /* 表示当前链表结束 */  
  218. }  
0 0
原创粉丝点击