其实如果c语言学的够好,这些东西也不是很难,很多人学习链表觉得难,是指针学的不够好。
//单链表(线性表的链式存储)的实现
#include <stdio.h>
#include <stdlib.h>
//定义数据类型
typedef int datatype_t;
//定义单链表结构体
typedef struct node{
datatype_t data; //数据域
struct node *next; //指针域(指向结构体的)
}linklist_t;
//创建一个空的单链表
linklist_t *linklist_create()
{
linklist_t *ll;
ll = (linklist_t *)malloc(sizeof(linklist_t));
ll->next = NULL;
return ll;
}
//插入数据(头插法)
int linklist_insert_head(linklist_t *ll, datatype_t value)
{
linklist_t *temp;
temp = (linklist_t *)malloc(sizeof(linklist_t));
temp->data = value;
temp->next = ll->next;
ll->next = temp;
return 0;
}
//打印数据
int linklist_show(linklist_t *ll)
{
while(ll->next != NULL)
{
ll = ll->next;
printf("%d ", ll->data);
// printf("%d ", ll->next->data);
// ll = ll->next;
}
putchar(10);
return 0;
}
//插入数据(尾插法)
int linklist_insert_tail(linklist_t *ll, datatype_t value)
{
linklist_t *temp;
temp = (linklist_t *)malloc(sizeof(linklist_t));
temp->data = value;
while(ll->next != NULL)
{
ll = ll->next;
}
ll->next = temp;
temp->next = NULL;
return 0;
}
//删除数据(头删法)
datatype_t linklist_delete_head(linklist_t *ll)
{
linklist_t *temp;
datatype_t value;
temp = ll->next;
value = temp->data;
ll->next = temp->next;
free(temp);
temp = NULL;
return value;
}
//更改数据
int linklist_change(linklist_t *ll, datatype_t old_value, datatype_t new_value)
{
while(ll->next != NULL)
{
if(ll->next->data == old_value)
{
ll->next->data = new_value;
return 0;
}
else
{
ll = ll->next;
}
}
printf("value is not exist
");
return -1;
}
//按照数据查找位置
int linklist_search_value(linklist_t *ll, datatype_t value)
{
int pos = 1;
while(ll->next != NULL)
{
if(ll->next->data == value)
{
return pos;
}
else
{
ll = ll->next;
pos++;
}
}
printf("the value is not exist
");
return -1;
}
//按照位置插入数据
int linklist_insert_pos(linklist_t *ll, int pos, datatype_t value)
{
int i = 0;
linklist_t *temp;
temp = (linklist_t *)malloc(sizeof(linklist_t));
temp->data = value;
while(i < pos && ll->next != NULL)
{
ll = ll->next;
i++;
}
temp->next = ll->next;
ll->next = temp;
return 0;
}
//按照顺序插入数据(自带排序功能)
int linklist_insert_sort(linklist_t *ll, datatype_t value)
{
linklist_t *temp = (linklist_t *)malloc(sizeof(linklist_t)) ;
temp->data = value;
while(ll->next != NULL && ll->next->data < temp->data)
{
ll = ll->next;
}
temp->next = ll->next;
ll->next = temp;
return 0;
}
//实现链表的翻转
//10 20 30 40 50
//50 40 30 20 10
int linklist_recover(linklist_t *ll)
{
linklist_t *p = ll->next; //p指向我们的有数据的链表
linklist_t *q = NULL; //q专门负责获取结点并插入到链表后面
ll->next = NULL;
while(p != NULL)
{
q = p;
p = p->next;
q->next = ll->next;
ll->next = q;
}
return 0;
}
int main(int argc, const char *argv[])
{
linklist_t *ll = linklist_create();
linklist_insert_head(ll, 10);
linklist_insert_head(ll, 20);
linklist_insert_head(ll, 30);
linklist_insert_head(ll, 40);
linklist_insert_head(ll, 50);
linklist_insert_head(ll, 60);
linklist_show(ll);
linklist_insert_tail(ll, 20);
linklist_insert_tail(ll, 30);
linklist_insert_tail(ll, 40);
linklist_insert_tail(ll, 50);
linklist_insert_tail(ll, 60);
linklist_show(ll);
printf("del = %d
", linklist_delete_head(ll));
linklist_show(ll);
linklist_change(ll, 60, 70);
linklist_show(ll);
printf("value = 50, pos = %d
", linklist_search_value(ll, 50));
printf("value = 20, pos = %d
", linklist_search_value(ll, 20));
linklist_insert_pos(ll, 3, 80);
linklist_show(ll);
printf("****************************** ");
linklist_t *ll1 = linklist_create();
linklist_insert_sort(ll1, 10);
linklist_insert_sort(ll1, 30);
linklist_insert_sort(ll1, 20);
linklist_insert_sort(ll1, 50);
linklist_insert_sort(ll1, 40);
linklist_show(ll1);
linklist_recover(ll1);
linklist_show(ll1);
return 0;
}