创建一个链表的节点函数
/*
* 创建一个结点
*/
linklist list_create(){
linklist H;
H = (linklist)malloc(sizeof(listnode));
H->data = 0;
H->next = NULL;
return H;
}
链表的尾部插入函数功能
/*
* 尾部插入
*/
int list_tail_insert(linklist H, data_t value){
if (H == NULL){
printf("H is NULL\n");
return -1;
}
//新建一个结点
linklist p;
linklist q;
if ((p = (linklist)malloc(sizeof(listnode))) == NULL){
printf("malloc is failed\n");
return -1;
}
p->data = value;
p->next = NULL;
//找尾结点
q = H;
while(q->next != NULL){
q = q->next;
}
//插入结点
q->next = p;
return 0;
}
遍历单链表的功能函数
/*
* 遍历链表
*/
int list_show(linklist H){
linklist p;
//判断链表是否为空
if (H == NULL){
printf("H is NULL\n");
return -1;
}
p = H;
while (p->next != NULL){
printf("%d ", p->next->data);
p = p->next;
}
puts("");
return 0;
}
获取链表某个位置的节点
/*
* 获取某个位置的结点
*/
linklist list_get(linklist H, int pos){
linklist p;
int i = 0;
if (H == NULL || pos < -1)
return NULL;
if (pos == -1)
return H;
p = H;
while(i <= pos){
if (p->next == NULL){
printf("pos_get is invalid\n");
return NULL;
}
p = p->next;
i++;
}
return p;
}
按位置插入节点
/*
* 按位置插入结点
*/
int list_insert(linklist H, data_t value, int pos){
if (H == NULL)
return -1;
linklist p, q;
q = list_get(H, pos-1);
p = (linklist)malloc(sizeof(listnode));
p->data = value;
p->next = NULL;
p->next = q->next;
q->next = p;
return 0;
}
按位置删除节点
/*
* 按位置删除结点
*/
int list_delete(linklist H, int pos){
if (H == NULL)
return -1;
linklist p, q;
p = list_get(H, pos-1);
if (p == NULL || p->next == NULL){
printf("pos_del is invalid\n");
return -1;
}
q = p->next;
p->next = q->next;
free(q);
q = NULL; //防止野指针
return 0;
}
释放链表
//释放链表
linklist list_free(linklist H){
if (H == NULL)
return NULL;
linklist p;
p = H;
printf("free:");
while (H != NULL){
p = H;
H = H->next;
printf("%d ", p->data);
free(p);
}
puts("");
return NULL;
}
链表的反转
//链表的反转
int list_reverse(linklist H){
linklist p, q;
if (H == NULL)
return -1;
if (H->next == NULL || H->next->next == NULL)
return 0;
p = H->next->next;
H->next->next = NULL;
while(p != NULL){
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
return 0;
}
求相邻两个节点和的最大值和前一个节点的指针地址
//求相邻两个结点和的最大值的前一个结点的指针
linklist list_adjmax(linklist H, data_t *value){
linklist p, q, r;
data_t sum;
if (H == NULL)
return NULL;
if (H->next == NULL || H->next->next == NULL || H->next->next->next == NULL)
return H;
q = H->next;
p = H->next->next;
sum = q->data + p->data;
r = q;
while (p->next !=NULL) {
p = p->next;
q = q->next;
if (sum < (q->data+p->data)) {
sum = q->data+p->data;
r = q;
}
}
*value = sum;
return r;
}
两个有序链表合并为一个有序链表
//两个有序链表合并为一个有序链表
int list_merge(linklist H1,linklist H2){
linklist p, q, r;
if (H1 == NULL || H2 == NULL)
return -1;
p = H1->next;
q = H2->next;
r = H1;
H1->next = NULL;
H2->next = NULL;
while (p && q) {
if (p->data < q->data){
r->next = p;
p = p->next;
r = r->next;
r->next = NULL;
} else {
r->next = q;
q = q->next;
r = r->next;
r->next = NULL;
}
}
if (p == NULL) {
r->next = q;
} else {
r->next = p;
}
return 0;
}
将一个无序链表变为有序递增的
//将一个无序链表变为递增
int list_order(linklist H){
linklist p, q, r;
data_t t;
if (H == NULL)
return -1;
p = H->next;
while (p){
q = p->next;
while (q){
if (p->data > q->data){
t = p->data;
p->data = q->data;
q->data = t;
}
q = q->next;
}
p = p->next;
}
return 0;
}