/*******************************************/
文件名:linklist.c
功能:函数内容
/*******************************************/
#include "linklist.h"
NodePtr list_create()
{
NodePtr L = (NodePtr)malloc(sizeof(Node));
if (NULL == L)
{
printf("创建失败\n");
return NULL;
}
L->len = 0;
L->next = NULL;
printf("链表创建成功\n");
return L;
}
NodePtr apply_node(datatype e)
{
NodePtr p = (NodePtr)malloc(sizeof(Node));
if (NULL == p)
{
printf("节点申请失败\n");
return NULL;
}
p->data = e;
p->next = NULL;
return p;
}
int list_empty(NodePtr L)
{
return L->next == NULL;
}
int list_insert_head(NodePtr L, datatype e)
{
if (NULL == L)
{
printf("链表不合法\n");
return -1;
}
NodePtr p = apply_node(e);
if (NULL == p)
{
return -1;
}
p->next = L->next;
L->next = p;
L->len++;
printf("头插成功\n");
return 0;
}
int list_show(NodePtr L)
{
if (NULL == L || list_empty(L))
{
printf("遍历失败\n");
return -1;
}
printf("链表中的元素分别是:");
NodePtr q = L->next;
while (q != NULL)
{
printf("%d\t", q->data);
q = q->next;
}
printf("\n");
}
NodePtr list_search_pos(NodePtr L, int pos)
{
if (NULL == L || list_empty(L) || pos < 0 || pos > L->len)
{
printf("查找失败\n");
return NULL;
}
NodePtr q = L;
for (int i = 0; i < pos; i++)
{
q = q->next;
}
return q;
}
int list_insert_pos(NodePtr L, int pos, datatype e)
{
if (NULL == L || list_empty(L) || pos < 1 || pos > L->len + 1)
{
printf("插入失败\n");
return -1;
}
NodePtr q = apply_node(e);
if (NULL == q)
{
return -1;
}
NodePtr p = list_search_pos(L, pos - 1);
q->next = p->next;
p->next = q;
L->len++;
printf("插入成功\n");
return 0;
}
int list_delete_head(NodePtr L)
{
if (NULL == L || list_empty(L))
{
printf("删除失败\n");
return -1;
}
NodePtr p = L->next;
L->next = p->next;
free(p);
p = NULL;
L->len--;
printf("头删成功\n");
return 0;
}
int list_delete_pos(NodePtr L, int pos)
{
if (NULL == L || list_empty(L) || pos < 1 || pos > L->len)
{
printf("删除失败\n");
return -1;
}
NodePtr p = list_search_pos(L, pos - 1);
NodePtr q = p->next;
p->next = p->next->next;
L->len--;
free(q);
q = NULL;
printf("删除成功\n");
return 0;
}
int list_search_value(NodePtr L, datatype e)
{
if (NULL == L || list_empty(L))
{
printf("查找失败\n");
return -1;
}
NodePtr q = L->next;
for (int i = 1; i <= L->len; i++)
{
if (q->data == e)
{
return i;
}
q = q->next;
}
printf("未找到\n");
return -1;
}
int list_update_pos(NodePtr L, int pos, datatype e)
{
if (NULL == L || list_empty(L) || pos < 1 || pos > L->len)
{
printf("修改失败\n");
return -1;
}
NodePtr p = list_search_pos(L, pos);
p->data = e;
printf("修改成功\n");
return 0;
}
int list_update_value(NodePtr L, datatype old_e, datatype new_e)
{
if (NULL == L || list_empty(L))
{
printf("修改失败\n");
return -1;
}
int res = list_search_value(L, old_e);
if (res == -1)
{
printf("没有要修改的值\n");
return -1;
}
list_update_pos(L, res, new_e);
printf("修改成功\n");
return 0;
}
void list_reverse(NodePtr L)
{
if (NULL == L || L->len <= 1)
{
printf("翻转失败\n");
return;
}
NodePtr H = L->next;
L->next = NULL;
NodePtr p = NULL;
while (H != NULL)
{
p = H;
H = H->next;
p->next = L->next;
L->next = p;
}
printf("翻转成功\n");
}
void list_destroy(NodePtr L)
{
if (NULL == L)
{
return;
}
while (!list_empty(L))
{
list_delete_head(L);
}
free(L);
L = NULL;
printf("释放成功\n");
}
void list_reverse_next(NodePtr L)
{
static int i = 0;
if (NULL == L || L->len <= 1)
{
printf("翻转失败\n");
return;
}
if (i == L->len)
{
printf("翻转完成\n");
return;
}
NodePtr p = list_search_pos(L, L->len);
NodePtr q = list_search_pos(L, L->len - 1);
NodePtr r = list_search_pos(L, i);
q->next = NULL;
p->next = r->next;
r->next = p;
i++;
list_reverse_next(L);
}
void list_sort(NodePtr L)
{
if (NULL == L || L->len <= 1)
{
printf("排序失败\n");
return;
}
for (int i = 1; i < L->len; i++)
{
NodePtr p = L->next;
NodePtr q = L->next->next;
NodePtr r = L;
for (int j = 0; j < L->len - i; j++)
{
if (p->data > q->data)
{
p->next = q->next;
r->next = q;
q->next = p;
q = p->next;
r = r->next;
}
else
{
p = p->next;
q = p->next;
r = r->next;
}
}
}
printf("排序完成\n");
}
void list_remove(NodePtr L)
{
for (int i = 0; i < L->len-1; i++)
{
NodePtr p = list_search_pos(L, i);
for (int j = i+1; j < L->len; j++)
{
NodePtr q = list_search_pos(L, j);
if (p->data == q->data)
{
NodePtr r = list_search_pos(L, j - 1);
r->next = q->next;
L->len--;
free(q);
q=NULL;
j--;
}
}
}
printf("去重成功\n");
}
/*******************************************/
文件名:linklist.h
功能:函数声明
/*******************************************/
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
} Node, *NodePtr;
NodePtr list_create();
NodePtr apply_node(datatype e);
int list_empty(NodePtr L);
int list_insert_head(NodePtr L, datatype e);
int list_show(NodePtr L);
NodePtr list_search_pos(NodePtr L, int pos);
int list_insert_pos(NodePtr L, int pos, datatype e);
int list_delete_head(NodePtr L);
int list_delete_pos(NodePtr L, int pos);
int list_search_value(NodePtr L, datatype e);
int list_update_pos(NodePtr L, int pos, datatype e);
int list_update_value(NodePtr L, datatype old_e, datatype new_e);
void list_reverse(NodePtr L);
void list_destroy(NodePtr L);
void list_reverse_next(NodePtr L);
void list_sort(NodePtr L);
void list_remove(NodePtr L);
#endif
/*******************************************/
文件名:main1.c
功能:函数内容
/*******************************************/
#include "linklist.h"
int main(int argc, char const *argv[])
{
NodePtr L = list_create();
if (NULL == L)
{
return -1;
}
list_insert_head(L, 520);
list_insert_head(L, 1314);
list_insert_head(L, 555);
list_insert_head(L, 666);
list_show(L);
list_insert_pos(L, 1, 888);
list_insert_pos(L, 2, 888);
list_insert_pos(L, 4, 777);
list_insert_pos(L, 7, 999);
list_show(L);
list_delete_head(L);
list_show(L);
list_delete_pos(L, 3);
list_show(L);
int a = list_search_value(L, 888);
if (a != -1)
{
printf("要找的在第%d个位置\n", a);
}
int b = list_search_value(L, 1);
if (b != -1)
{
printf("要找的在第%d个位置\n", b);
}
list_update_pos(L, 1, 1130);
list_show(L);
list_update_value(L,666,888);
list_update_value(L,345,777);
list_show(L);
list_reverse(L);
list_show(L);
list_reverse_next(L);
list_show(L);
list_sort(L);
list_show(L);
list_insert_pos(L, 1, 888);
list_insert_pos(L, 3, 888);
list_insert_pos(L, 1, 888);
list_insert_pos(L, 7, 999);
list_show(L);
list_remove(L);
list_show(L);
list_destroy(L);
L=NULL;
list_show(L);
return 0;
}