一.练习
1). 双向链表按位置删除
int delete_index(int index, double_linklist l) {
if (l == NULL || index < 1 || index > l->len) {
printf("删除失败\n");
return -1;
}
double_linklist p = l->next;
for (int i=0; i<index-1; i++) {
p = p->next;
}
p->prev->next = p->next;
if (p->next) {
p->next->prev = p->prev;
}
free(p);
p=NULL;
l->len--;
return 0;
}
2). 双向链表按位置修改
int update_index(int index, datatype e, double_linklist l) {
if (l == NULL || l->next == NULL || index < 1 || index>l->len) {
printf("查找失败\n");
return -1;
}
double_linklist p = l->next;
for (int i=0; i<index-1; i++) {
p = p->next;
}
p->data = e;
return 0;
}
3). 双向链表按位置查找
int find_index(int index,datatype *result, double_linklist l) {
if (l == NULL || l->next == NULL || index < 1 || index>l->len) {
printf("查找失败\n");
return -1;
}
double_linklist p = l->next;
for (int i=0; i<index-1; i++) {
p = p->next;
}
*result = p->data;
return 0;
}
4). 双向循环链表头插
int insert_head(loop_double_link_list l, datatype e) {
if (l == NULL) {
printf("头插失败\n");
return -1;
}
//创建node
loop_double_link_list s = create(0);
s->data = e;
s->next = l->next;
s->prev = l;
l->next->prev = s;
l->next = s;
l->len++;
return 0;
}
5). 双向循环链表头删
//头删
int delete_head(loop_double_link_list l) {
if (l == NULL || l->next == l) {
printf("头删失败 \n");
return -1;
}
loop_double_link_list p = l->next;
l->next = p->next;
p->next->prev = l;
l->len--;
free(p);
p = NULL;
return 0;
}
6). 双向循环链表尾插
//尾插
int insert_rear(loop_double_link_list l, datatype e) {
if (l == NULL) {
printf("尾插失败\n");
return -1;
}
//创建Node
loop_double_link_list s = create(0);
s->data = e;
s->next = l;
s->prev = l->prev;
l->prev->next = s;
l->prev = s;
l->len++;
return 0;
}
7). 双向循环链表尾删
//尾删
int delete_rear(loop_double_link_list l) {
if (l == NULL || l->next == l) {
printf("头删失败 \n");
return -1;
}
loop_double_link_list p = l->prev;
p->prev->next = l;
l->prev = p->prev;
l->len--;
free(p);
p = NULL;
return 0;
}
8).双向循环链表遍历输出
void output(loop_double_link_list l) {
if (l == NULL || l->next == l) {
printf("遍历失败 \n");
return;
}
loop_double_link_list p = l;
printf("正向输出:");
while(p->next != l) {
p = p->next;
printf("%.1f ", p->data);
}
printf("\n");
printf("反向输出:");
p = l->prev;
while(p != l) {
printf("%.1f ", p->data);
p = p->prev;
}
printf("\n");
}