//linklist.h
#ifndef LINKLIST_H_
#define LINKLIST_H_
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}listnode, *linklist;
linklist linklist_create();
int linklist_insert(linklist L, datatype x, int pos);
int linklist_order_insert(linklist L, datatype x);
int linklist_delete(linklist L, int pos);
int linklist_delete(linklist L, datatype data);
int linklist_show(linklist L);
int linklist_reverse(linklist L);
int linklist_clear(linklist L);
int linklist_is_empty(linklist L);
bool linklist_Exist(linklist L, datatype data);
#endif
//linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
//新建一个空链表
linklist linklist_create()
{
linklist L;
if ((L = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc error\n");
return NULL;
}
L->next = NULL;
return L;
}
//链表在指定位置插入
int linklist_insert(linklist L, datatype x, int pos)
{
linklist p, q = L;
while (pos--)
{
q = q->next;
if (q == NULL)
{
printf("insert position invalid\n");
return -1;
}
}
p = (linklist)malloc(sizeof(listnode));
p->data = x;
p->next = q->next;
q->next = p;
return 0;
}
//链表按顺序插入
int linklist_order_insert(linklist L, datatype x)
{
linklist p, q;
p = L;
while (p -> next != NULL && p->next->data < x)
p = p->next;
q = (linklist)malloc(sizeof(listnode));
q->data=x;
q->next = p->next;
p->next = q;
return 0;
}
//链表删除指定位置的节点
int linklist_delete(linklist L, int pos)
{
linklist p, q;
p = L;
while (--pos)
{
p=p->next;
if (p->next == NULL)
{
printf("delete position is invalid.\n");
return -1;
}
}
q = p->next;
p->next = p->next->next;
free(q);
q = NULL;
return 0;
}
//链表删除等于特定值的节点
int linklist_delete(linklist L, datatype data)
{
linklist p, q;
p = L;
while (p->next != NULL)
{
if (p->data == data)
{
q = p->next;
p->next = p->next->next;
free(q);
q = NULL;
//break;
}
p = p->next;
}
return 0;
}
//打印链表
int linklist_show(linklist L)
{
linklist p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
//链表逆序
int linklist_reverse(linklist L)
{
linklist p, q;
p = L->next;
L->next = NULL;
while (p)
{
q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
return 0;
}
//删除链表
int linklist_clear(linklist L)
{
linklist p = L;
while (L->next)
{
p = L->next;
L->next = p->next;
free(q);
q = NULL;
}
return 0;
}
//判断链表是否为空
int linklist_is_empty(linklist L)
{
if (L->next != NULL)
return 0;
else
return 1;
}
//查找链表(除头节点外)是否存在特定值得节点
bool linklist_Exist(linklist L, datatype data)
{
linklist p, q;
p = L->next;
bool flag = fase;
while (p != NULL)
{
if (p->data == data)
{
flag = true;
break;
}
p = p->next;
}
return flag;
}