#include <stdlib.h>
#include <stdbool.h>
#define TYPE int
typedef struct Node
{
TYPE data;
struct Node* next;
}Node;
// 创建节点
Node* create_node(TYPE data)
{
Node* node = malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
// 根据前驱节点删除元素
static bool _delete_list(Node* prev)
{
if(NULL == prev || NULL == prev->next)
return false;
Node* node = prev->next;
prev->next = node->next;
free(node);
return true;
}
static bool _insert_list(Node* prev,TYPE data)
{
if(NULL == prev)
return false;
Node* node = create_node(data);
node->next = prev->next;
prev->next = node;
return true;
}
// 返回index下标的前驱节点
static Node* _index_list(Node* head,int index)
{
// 找下标为i的节点的前驱
Node* prev = head;
while(NULL != prev->next && index-- >= 1)
prev = prev->next;
// index 非法,超出了节点的数量
if(NULL == prev->next || index < -1)
return NULL;
return prev;
}
// 查询出值为data的前驱节点
static Node* _query_list(Node* head,TYPE data)
{
Node* prev = head;
while(NULL != prev->next && data != prev->next->data)
prev = prev->next;
if(NULL == prev->next)
return NULL;
return prev;
}
// 创建带头的空链表
Node* create_list(void)
{
Node* node = malloc(sizeof(Node));
node->next = NULL;
return node;
}
// 销毁链表
void destory_list(Node* head)
{
while(NULL != head)
{
Node* node = head;
head = head->next;
free(node);
}
}
// 在头部添加元素
void front_list(Node* head,TYPE data)
{
_insert_list(head,data);
}
// 在指定位置插入元素
bool insert_list(Node* head,int index,TYPE data)
{
return _delete_list(_index_list(head,index));
}
// 按值删除元素
bool delete_value_list(Node* head,TYPE data)
{
return _delete_list(_query_list(head,data));
}
// 按值修改
bool modify_value_list(Node* head,TYPE old,TYPE new)
{
Node* prev = _query_list(head,old);
if(NULL == prev)
return false;
prev->next->data = new;
return true;
}
// 按位置修改
bool modify_index_list(Node* head,int index,TYPE new)
{
Node* prev = _index_list(head,index);
if(NULL == prev)
return false;
prev->next->data = new;
return true;
}
// 访问指定位置的元素
bool get_list(Node* head,int index,TYPE* data)
{
Node* prev = _index_list(head,index);
if(NULL == prev)
return false;
*data = prev->next->data;
return true;
}
// 查询元素
int query_list(Node* head,TYPE key)
{
int index = 0;
for(Node* n=head->next; NULL!=n; n=n->next)
{
if(n->data == key)
return index;
index++;
}
return -1;
}
// 经典排序
void sort_list(Node* head)
{
for(Node* i=head->next; NULL!=i->next; i=i->next)
{
for(Node* j=i->next; NULL!=j; j=j->next)
{
if(i->data > j->data)
{
TYPE tmp = i->data;
i->data = j->data;
j->data = tmp;
}
}
}
}
void show_list(Node* head)
{
// 要跳过头节点
for(Node* n=head->next; NULL!=n; n=n->next)
{
printf("%d ",n->data);
}
printf("\n");
}
int main(int argc,const char* argv[])
{
Node* list = create_list();
for(int i=0; i<10; i++)
{
front_list(list,rand()%100);
}
show_list(list);
//delete_index_list(list,-1);
//delete_value_list(list,9);
insert_list(list,9,100);
sort_list(list);
show_list(list);
return 0;
}
线性表(线性表的链式表示和实现)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 线性表的逻辑结构 1.线性表的定义 线性表是具有相同类型的n(>=0)个数据元素的有限序列。 2.线性表的顺序表示...
- 理清概念:头指针:链表如果存在头结点则指向头结点,否者指向首结点。头结点:为了方便对链表的操作而引入的一个结点,数...
- 1 双链表 双链表结点中有两个指针prior和next,分别指向其前驱结点和后继节点。双链表中结点类型的描述如下:...