线性表——单链表的基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**********************************************************
*  单链表的存储结构定义
***********************************************************/
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;
/**********************************************************
*  单链表的基本操作的实现
***********************************************************/
 
//创建并初始化为空表
Status InitList(LinkList &L)
{     L=(LNode*)malloc(sizeof(LNode));
     if(L==NULL) return ERROR;
      L->next=NULL;
       return OK;
}
 
//销毁整个表(从此之后不再可用)
Status DestroyList(LinkList &L)
{
    // TODO (#1#): 销毁表
    return ERROR;
    //-------------------------------------
}
 
//将表L置空
Status ClearList(LinkList &L)
{   L->next=NULL;
    return OK;
}
 
//判断表L是否为空表
bool ListEmpty(LinkList L)
{   if(L->next==NULL) return true;
    return false;
    //-------------------------------------
}
 
//求表L的长度
int ListLength(LinkList L)
{   LNode* p=L->next;
    int j=0;
    while(p||p!=NULL)
    {p=p->next;
     j++;
    }
    return j;
}
 
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR
Status GetElem(LinkList L, int i, ElemType &e)
{   LNode* p=L->next;
    int j=1;
    while(p||j<i)
    { p=p->next;
       j++;
    }
     if(!p||j>i) return ERROR;
       e=p->data;
       return OK;
    //-------------------------------------
}
 
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0
//    compare(a,b) 为比较函数,匹配时返回true,否则返回false
int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType))
int j=1;  
   LNode* p = L->next;
   while(p!=NULL) {
      if( compare(p->data,e) )  return j;
        p=p->next;
        j++;
   }
       return 0;
 
}
 
 
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
Status ListInsert(LinkList &L, int i, ElemType e)
{   LNode* p=L;
    int j=0 ;
   while(p&&j<i-1)
   {p=p->next;
    j++;
   }
   if(!p||j>i-1) return ERROR;
   LNode* s=(LNode*)malloc(sizeof(LNode));
   s->data=e;
   s->next=p->next;
   p->next=s;
  return OK;
}
 
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR
Status ListDelete(LinkList &L, int i, ElemType &e)
{    LNode* p=L->next;
   int j=1;
   while(p&&j<i-1)
   {p=p->next;
    j++;
   }
   if(!p||j>i-1) return ERROR;
   p->next=p->next->next;
   free(p);
   return OK;
}
 
//遍历表L,对每个元素调用visit(x).
Status ListTraverse(LinkList L, Status (*visit)(ElemType))
{
    LinkList p = L->next;
    while ( p ) {
        if ( visit(p->data)==ERROR )  return ERROR;
        p = p->next;
    }
    return OK;
}

 

posted @   北有孤鹜  阅读(286)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示