zoukankan      html  css  js  c++  java
  • 线性表链式存储方式的C语言实现

      1 /*
      2   编译器:Dev-c++ 5.1.0 
      3   文件名:linkList3.cpp 
      4   代码版本号:1.0
      5    时间:2015年9月24日11:34:16
      6 */
      7 
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 #include <time.h>
     11 #define ERROR 0
     12 #define OK 1
     13 #define TRUE 1
     14 #define FALSE 0
     15 #define OVERFLOW -2
     16 
     17 typedef int Status;
     18 typedef int ElemType;
     19 
     20 typedef struct lNode{
     21 ElemType data;
     22 struct lNode *next;
     23 }lNode,*linkList;
     24 
     25 /*初始化建立空链表 ---测试成功*/
     26 Status initList(linkList *l){    
     27     *l=(linkList)malloc(sizeof(lNode)); //产生头结点,使L指向头结点 
     28     if(!*l){
     29         exit(OVERFLOW);
     30         return ERROR;
     31     }
     32     (*l)->next=NULL;
     33     return OK;
     34 }
     35 
     36 /*判定是否为空表 ---测试成功*/
     37 bool isEmpty(linkList l){
     38     if(l->next)
     39         return FALSE;
     40     return TRUE;
     41 } 
     42 
     43 /*清空链表 ---测试成功*/
     44 Status clearList(linkList *l){
     45     linkList p=(*l)->next;
     46     linkList q;
     47     while(!p)
     48     {
     49         q=p;
     50         free(q);
     51         p=p->next;
     52     }
     53     (*l)->next=NULL;//头结点指针域为空 
     54     return OK;
     55 } 
     56 
     57 /*返回L中数据元素个数 ---测试成功*/
     58 int listLength(linkList l){
     59     int i=0;
     60     linkList p=l->next;
     61     while(p){
     62         //printf("listLength()函数while语句
    ") ;
     63         i++;//i=1 
     64         p=p->next;
     65     }
     66     return i;
     67 }
     68 
     69 /*用e返回L中第i个数据元素的值---测试成功*/
     70 Status getElem(linkList *l,int i,ElemType *e){
     71     linkList p=(*l)->next;
     72     int j=1;
     73     if(i<1||i>listLength(*l))
     74     {
     75         exit(OVERFLOW);
     76         return ERROR;
     77     }
     78     
     79     while(p&&j!=i)
     80     {
     81         p=p->next;
     82         j++;
     83     }
     84     
     85     if(!p)
     86         return ERROR;
     87     
     88     *e=p->data;
     89     return OK;
     90 }
     91 
     92 /*返回L中第1个与e满足关系的数据元素的位序,若没有则返回0 ---测试成功 */ 
     93 int locateElem(linkList l,ElemType e){
     94     linkList p=l->next;
     95     int i=1;
     96     while(p&&p->data!=e)
     97     {
     98         p=p->next;
     99         i++;
    100     }
    101     if(!p)
    102         return 0;
    103     else
    104         return i;
    105 } 
    106 
    107 /*在L中第i个位置之前插入新的数据元素e,L的长度加1 ---测试成功*/
    108 Status listInsert(linkList *l,int i,ElemType e){
    109     
    110     linkList p=(*l); //p=NULL;
    111     linkList q;
    112     int j=0;
    113     
    114     if(i<1||i>(listLength(*l)+1))
    115     {
    116         return ERROR;
    117     }
    118     while(p&&j<i-1) // 1<2
    119     {
    120         j++; //j=2
    121         p=p->next;//p 第2个 
    122     }
    123 
    124     q=(linkList)malloc(sizeof(lNode)); 
    125     q->data=e; //q->data=5;
    126     q->next=p->next;//q->next=NULL
    127     p->next=q;//p->next=q
    128     return OK;    
    129 }
    130 
    131 /*删除L的第i个数据元素,并用e返回其值,L的长度减1 ---测试成功*/
    132 Status deleteElem(linkList *l,int i,ElemType *e){
    133      linkList p=(*l)->next;
    134      int j=1;
    135      if(i<1||i>listLength(*l))
    136     {
    137         return ERROR;
    138     }
    139     while(p&&j<i-1) //j指向第8个元素 
    140     {
    141         j++;
    142         p=p->next;
    143     } 
    144     if(!p)
    145         return ERROR;
    146     else{
    147         linkList q=p; //q指向第8个元素     
    148         *e=q->next->data; //第9个元素的data赋给*e 
    149         p->next=p->next->next;//第8个元素下一个是第10个元素 
    150         free(q->next);
    151         return OK;
    152     }
    153 } 
    154 
    155 /*依次对L的每个数据元素输出---测试成功 */
    156 Status listTraverse(linkList *l){
    157     linkList p=(*l)->next;
    158     int j=1;
    159     
    160     while(p)
    161     {
    162         printf("第%d个结点的数据为%d
    ",j,p->data);
    163         p=p->next;
    164         j++;
    165     }
    166     return OK;
    167     
    168 }
    169 
    170 /*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)---测试成功*/ 
    171 Status createListHead(linkList *l,int n)
    172 {
    173     srand(time(NULL));
    174     linkList q;
    175     for(int i=1;i<=n;i++){
    176         q=(linkList)malloc(sizeof(lNode));
    177         q->data=rand()%100+1;
    178         q->next=(*l)->next;
    179         (*l)->next=q;
    180     }
    181     return OK; 
    182 }
    183 
    184 /*随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法)---测试成功*/ 
    185 Status createListTail(linkList *l, int n)  
    186 {
    187     srand(time(NULL));
    188     linkList q;
    189     linkList tail=(*l);
    190     for(int i=1;i<=n;i++){
    191         q=(linkList)malloc(sizeof(lNode));
    192         q->data=rand()%100+1;
    193         q->next=NULL;
    194         tail->next=q;
    195         tail=tail->next;
    196     }
    197     return OK; 
    198 }
    199 
    200 int main(){
    201     ElemType e;//节点的数据data
    202     linkList L;
    203     initList(&L);
    204     if(isEmpty(L))
    205         printf("循环赋值前是空表
    ");
    206     else
    207         printf("循环赋值前不是空表
    "); 
    208     createListTail(&L,5);
    209     
    210     printf("链表长度为%d
    ",listLength(L));
    211     listTraverse(&L);
    212     int n;
    213     printf("请输入要删除的元素位序:");
    214     scanf("%d",&n);
    215     deleteElem(&L,n,&e);
    216     printf("删除第%d个元素的值为%d
    ",n,e);
    217     printf("删除后链表的长度为%d",listLength(L));
    218     return 0;
    219 }
  • 相关阅读:
    如何使网站不出现从客户端(:)中检测到有潜在危险的 Request.Path 值这样类似的提示
    layui下select下拉框不显示或没有效果
    video
    各个平台的mysql重启命令
    微信开放平台 redirect_uri参数错误
    JS中setTimeout()的用法详解
    验证视图状态MAC失败的解决办法
    The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
    一个Nginx部署多个vue前端项目总结
    Java之HttpClient调用WebService接口发送短信源码实战
  • 原文地址:https://www.cnblogs.com/gangtiexia/p/4834807.html
Copyright © 2011-2022 走看看