对于计算机内存而言,能有一片连续的内存空间是非常奢侈的。而线性的顺序表示类似数组的存储方式,需要连续的存储空间。而对于单链表来说,就单个节点的内部是一个整体,就需要占用连续的存储空间;而节点间是通过指针链接起来的,所以说各个节点间的位置是可以不连续的,也可以是连续的,也就是说在空间上是可以不连续的。因此就体现出了链表的优势。
单链表
将链表中各元素分布在存储器的不同存储块称为节点,通过地址或者指针建立他们之间的关系,所得到的存储结构就是链表结构。
单链表的单个节点由一个指针域和数据域组成(头结点数据域不放值,只是一个单纯的指针)。
链表节点类型描述
typedef int data_t; //用data_t替代int类型
typedef struct node{
data_t data; //定义节点的数据域
struct node *next; //定义节点的后继指针域
}linklist;
相关的算法操作
linklist *CreateLinklist();//创建头结点 创建空链表
linklist *CreateLinklist(){
linklist *head = (linklist *)malloc(sizeof(linklist));
if(head == NULL)
return NULL;
head->data = -1; //因为head的数据域不能放值,我们就指定一个值给它
head->next = NULL; //head的下一个节点定为空
return head;
}
int Linklist_is_empty(linklist * head); //判断链表是否为空
int LInklist_is_empty(linklist *head){
if(head == NULL)
return -1;
return head->next == NULL;
}
int getLengthLinklist(linklist *head); //求链表有效结点的长度(不包含头结点)
int getLengthLInklist(linklist *head){
if(head == NULL)
return -1;
int i = 0;
linklist *p = head->next;
for(p){
i++;
p = p->next;
}
return i;
}
int InsertLinklistBypos(linklist *head,int pos,data_t data); //按位置进行插入
int InsertLinklistBypos(linklist *head,int pos,data_t data){
if(head == NULL)
return -1;
if(pos<0 || pos>getLengthLinklist(head)) //判断插入位置
return -1;
//接下来需要创建一个新的节点来作为插入节点
linklist *new = (linklist *)malloc(sizeof(linklist));
if(new == NULL)
return -1;
new->data = data; //将插入的值给新节点new的数据域
new->next = NULL; //将new的指针域定为空
//将节点插入链表中
linkilist *p = head->next; //重新定义一个变量p,用于遍历
while(pos--){
p = p->next;
}
new->next = p->next;
p->next = new;
return 0;
}
int DeleteLinklistBypos(linklist *head,int pos); //按位置进行删除
int DeleteLinklistBypos(linklist *head,int pos){
if(head == NULL)
return -1;
if(pos < 0 || pos > getLengthLinklist(head)-1 || Linklist_is_empty(head))
return -1;
linklist *p = head;
while(pos--)
p = p->next;
linklist *q = p->next;
p->next = q->next;
free(q);
q = NULL;
return 0;
}
int DeleteLinklistBydata(linklist *head,data_t data); //按值进行删除
int DeleteLinklistBydata(linklist *head,data_t data){
if(head == NULL)
return -1;
linklist *p = head;
linklist *q = NULL;
while(p){
//p = p->next;
if(p->next->data == data)
break;
else
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);
q = NULL;
return 0;
}
data_t SearchLinklistBypos(linklist *head,int pos); //按位置进行查找,返回值
data_t SearchLinklistBypos(linklist *head,int pos){
if(head == NULL)
return -1;
if(pos<0 || pos>getLengthLInklist(head))
return -1;
int i = 0;
linklist *p = head->next;
while(pos--){
p = p->next;
}
return p->data;
}
linklist * SearchLinklistBydata(linklist *head,data_t data); //按值进行查找,返回位置
linklist *SearchLinklistBydata(linklist *head,data_t data){
if (head == NULL)
return -1;
linklist *p = head->next;
while(p){
if(data == p->data)
break;
p = p->next;
}
return p;
}
int ChangeLinklistBypos(linklist *head,int pos,data_t data);//按位置进行修改
int ChangeLinklistBypos(linkliost *head,int pos,data_t data){
if(head == NULL)
return -1;
if(pos < 0 || pos > getLengthLinklist(head)-1 || Linklist_is_empty(head))
return -1;
linklist *p = head->next;
while(pos--){
p = p->next;
}
p->data = data;
return 0;
}
int ChangeLinklistBydata(linklist *head,data_t old,data_t new);//按值修改
int ChangeLinklistBydata(linklist *head,data_t old,data_t new)
{
if(head == NULL)
return -1;
linklist *p = head->next;
while(p){
if(p->data == old)
p->data = new;
p = p->next;
}
return 0;
}
int ClearLinklist(linklist *head); //清空链表
int ClearLinklist(linklist *head) //清空链表
{
if(head == NULL)
return -1;
linklist *p = head->next;
linklist *q = NULL;
while(p != NULL){
q = p->next;
free(p);
p = q;
}
head->next = NULL;
return 0;
}
int destoryLinklist(linklist **head); //摧毁链表(包含头结点)
int destoryLinklist(linklist **head)
{
ClearLinklist(*head);
free(*head);
*head = NULL;
return 0;
}
int printfLinklist(linklist *head); //打印链表的数据
int printfLinklist(linklist *head)
{
if(head == NULL){
return -1;
}
linklist *p = head->next;
while(p){
printf("%3d",p->data);
p = p->next;
}
printf("\n");
return 0;
}
int daozhi(linklist *head); //将链表倒置
int daozhi(linklist *head){
if(head == NULL)
return -1;
linklist *p = head->next;
head->next = NULL;
linklist *q = NULL;
while(p){
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
return 0;
}