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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| /*线性表.链表&结构&算法*/
typedef struct LNode{
ElemType data;
struct LNode *next;
}*Link,Position;
typedef struct{
Link head, tail; //分别指向线性链表中的头结点和最后一个结点
int len; //指示线性表元素的个数
}LinkList;
Status MakeNode(Link *p, ElemType e){
(*p) = (Link)malloc(sizeof(Position));
if (!(*p))return ERROR;
(*p)->data = e;
(*p)->next = NULL;
return OK;
}//分配由p指向的值为e的结点,并返回OK,否则返回ERROR
void FreeNode(Link p){
free(p);
}//释放p所指的结点
Status InitList_L(LinkList *L){
L->head = (Link)malloc(sizeof(Position));
if (!L->head)exit(OVERFLOW); //空间分配失败
L->head->next = NULL;
L->tail = L->head;
L->len = 0;
return OK;
}//构造一个空的线性链表L
Status DestroyList_L(LinkList *L){
L->tail = L->head->next;
while (L->tail){
L->head->next = L->tail->next;
free(L->tail);
L->tail = L->head->next;
}
free(L->head);
L->len = 0;
return OK;
}//销毁L,L不在存在
Status ClearList_L(LinkList *L){
L->tail = L->head->next;
while (L->tail){
L->head->next = L->tail->next;
free(L->tail);
L->tail = L->head->next;
}
L->tail = L->head;
L->len = 0;
return OK;
}//重置L为空表,释放原链表的结点空间
Status InsFirst_L(Link h, Link s){
s->next = h->next;
h->next = s;
return OK;
}//已知h指向线性表头结点,将s所指结点插入在第一个结点之前
Status DelFirst_L(Link h, Position *q){
Link p = h->next;
if (!p)return ERROR; //表空
h->next = p->next;
*q = *p;
free(p);
return OK;
}//已知h指向线性表头结点,删除链表中的第一个结点并以q返回
Status Append_L (LinkList *L, Link s){
L->tail->next = s;
while (s){
L->tail = s;
L->len++;
s = s->next;
}
return OK;
}//把s所指指针接在L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点
Status Remove_L(LinkList *L, Position *q){
Link p = L->tail;
if (L->head == L->tail)return ERROR; //表空
*q = *(L->tail);
L->tail = L->head;
while (L->tail->next != p)
L->tail = L->tail->next;
free(p);
L->len--;
return OK;
}//删除线性表L中的尾结点并以返回,改变链表L的尾指针指向新的尾结点
Status InsBefore_L(LinkList *L, Link p, Link s){
Link q = L->head->next;
while (q->next != p&&q->next != NULL)
q = q->next;
q->next = s;
s->next = p;
p = s;
L->len++;
return OK;
}//已知p指向线性表L中的一个结点,将s所指结点插入在p所指结点前
Status InsAfter_L(LinkList *L, Link p, Link s){
Link q = p->next;
p->next = s;
s->next = q;
if (p == L->tail)
L->tail = s;
L->len++;
return OK;
}//已知p指向线性表L中的一个结点,将s所指结点插入在p所指结点后
Status SetCurElem_L(Link p, ElemType e){
p->data = e;
return OK;
}//已知p指向线性表中的一个结点,用e更新p所指结点的值
ElemType GetCurElem_L(Link p){
return p->data;
}//已知p指向线性表中的一个结点,返回p所指结点数据元素的值
Status ListEmpty_L(LinkList L){
if (L.len == 0)return TRUE;
else return FALSE;
}//若线性表L为空,则放回TRUE,否则返回FALSE
int ListLength_L(LinkList L){
return L.len;
}//返回线性表L中的元素个数
Position* GetHead_L(LinkList L){
return L.head;
}//返回L中头结点位置
Position* GetLast_L(LinkList L){
return L.tail;
}//返回线性表L中最后一个结点位置
Position* PriorPos_L(LinkList L, Link p){
Link q = L.head->next;
while (q->next != p&&q != NULL)
q = q->next;
return q;
}//已知p指向L中的一个结点,返回其前驱
Position* NextPos_L(LinkList L, Link p){
return p->next;
}//已知p指向线性表L中的一个结点,返回p所指结点的直接后继位置
Status LocatePos_L(LinkList L, int i, Link *p){
if (i<1 || i>L.len)return ERROR;
*p = L.head;
for (i; i >= 1; i--){
*p= (*p)->next;
}
return OK;
}//返回p指示线性表L中第i个结点的位置并返回OK,i不合法返回ERROR
Position* LocateElem_L(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){
Link p = L.head;
while (p){
if ((*compare)(e, p->data))
return p;
p = p->next;
}
return NULL;
}//返回线性表中第一个与e满足函数compare()判定关系的元素的位置,没有返回NULL
Status ListTraverse_L(LinkList L, Status(*visit)(ElemType)){
Link p = L.head;
while (p){
if (!(*visit)(p->data))return ERROR;
p = p->next;
}
return OK;
}//依次对L的每个元素调用函数visit()。一旦失败,则操作失败
|