现在浅展示一下单链表。单链表是一种常见的数据结构,它通过指针将数据元素连接在一起,形成一个线性序列。每个元素(通常称为节点)包含一个数据域和一个指针域,数据域存储实际的数据,指针域指向链表中的下一个节点。单链表的结构包含头尾指针以及结点数量,下面我们一起来看一下单链表的构造。
#define TYPE int
typedef struct Node
{
TYPE data;
struct Node *next;
}Node;
typedef struct List
{
Node *head;
Node *tail;
int cnt;
}List;
下面开始一些单链表的具体操作:(操作有点多,耐心看一下吧)
创建结点
//创建结点
Node *create_node(TYPE data)
{
Node *node=malloc(sizeof(Node));
node->data=data;
node->next=NULL;
return node;
}
创建链表
//创建链表
List *create_list(void)
{
List *list=malloc(sizeof(List));
list->head=create_node(0);//空的头结点
list->tail=NULL;
list->cnt=0;
return list;
}
头添加
//头添加
bool add_head(List *list,TYPE data)
{
Node *node=create_node(data);
if(0==list->cnt)
{
list->head->next=node;
list->tail=node;
return true;
}
node->next=list->head->next;
list->head->next=node;
list->cnt++;
return true;
}
尾添加
//尾添加
bool add_tail(List *list,TYPE data)
{
Node *node=create_node(data);
if(0==list->cnt)
{
list->head->next=node;
list->tail=node;
return true;
}
list->tail->next=node;
list->tail=node;
list->cnt++;
}
头删除
//头删除
bool del_head(List *list)
{
if(0==list->cnt) return false;
Node *temp=list->head->next;
list->head->next=temp->next;
if(1==list->cnt) list->tail=NULL;
free(temp);
temp=NULL;
list->cnt--;
return true;
}
尾删除
//尾删除
bool del_tail(List *list)
{
if(0==list->cnt) return false;
free(list->tail);
if(1==list->cnt)
{
list->head->next=NULL;
list->tail=NULL;
return true;
}
Node *prev=list->head->next;
while(prev->next!=list->tail) prev=prev->next;
prev->next=NULL;
list->tail=prev;
list->cnt--;
return true;
}
插入
//插入
bool insert_list(List *list,int index,TYPE data)
{
if(1==list->cnt) add_head(list);
while(--index>0)
{
list->head=list->head->next;
if(NULL=list->head->next) return false;
}
Node *node=create_node(data);
node->next=list->head->next;
list->head->next=node;
list->cnt++;
return true;
}
按值删除
//按值删除
bool del_value(List *list,TYPE val)
{
if(0==list->cnt) return false;
if(val==list->tail->data) del_tail(list);
if(val==lsit->head->next->data) del_head(list);
for(Node *n=list->head->next;n->next;n=n->next)
{
if(val==n->next->data)
{
Node *temp=n->next;
n->next=temp->next;
list->cnt--;
free(temp);
temp=NULL;
return true;
}
}
return false;
}
按位置删除
//按位置删除
bool del_index(List *list,int index)
{
while(--index>0)
{
list->head=list->head->next;
if(NULL==list->head->next) return false;
}
Node *temp=list->head->next;
list->head->next=temp->next;
list->cnt--;
free(temp);
temp=NULL;
return true;
}
按位置修改
//按位置修改
bool del_index(List *list,int index,TYPE data)
{
while(--index>0)
{
list->head=list->head->next;
if(NULL==list->head->next) return false;
}
list->head->next=data;
return true;
}
按值修改
//按值修改
bool modify_list(List *list,TYPE old,TYPE new)
{
if(0==list->cnt) return false;
int num=0;
for(Node *n=list->head->next;n->next;n=n->next;)
{
if(old==n->next->data)
{
n->next->data=new;
num++;
}
}
if(!num) return false;
return true;
}
查询
//查询
int query_list(List *list,TYPE key)
{
int index=0;
if(0==list->cnt) return -1;
for(Node *n=list->head->next;n;n=n->next,index++)
{
if(key==n->data) return index;
}
return -1;
}
排序
//排序
void sort_list(List *list)
{
for(Node *i=list->head->next;i->next;i=i->next)
{
for(Node *j=i->next;j;j=j->next)
{
if(j->data>i->data)
{
TYPE temp=i->data;
i->data=j->data;
j->data=temp;
}
}
}
}
访问
//访问
bool access_list(List *list,int index,TYPE *val)
{
if(0==list->cnt) return false;
while(--index>0)
{
list->head=list->head->next;
if(NULL=list->head->next) return false;
}
*val=list->head->next;
return true;
}
清空
//清空
void clean_list(List *list)
{
Node *n=list->head->next;
while(n)
{
Node *temp=n;
n=temp->next;
free(temp);
}
list->head->next=NULL;
list->tail=NULL;
list->cnt=0;
}
销毁
//销毁
void destroy_list(List *list)
{
clean_list(list);
free(list->head);
free(list->tail);
free(list);
}
遍历
//遍历
void show_list(List *list)
{
if(0==list->cnt) printf("空链表!\n");
for(Node *n=list->head->next;n;n=n->next)
{
printf("%d ",n->data);
}
printf("\n");
}
单链表差不多大概就是上面这些操作,至于测试此处省略一万行代码……
over