双向链表
#include <stdio.h>
#include <stdlib.h>
#include "./douloopfunc.h"
//创建双向循环链表
Douloop * createdou(void)
{
Douloop *head = (Douloop*)malloc(sizeof(Douloop));
if(head == NULL)
{
printf("失败\n");
return NULL;
}
//初始化节点
head->next = NULL; //让指针指向NULL
head->prev = NULL; //让指针指向NULL
head->msg.len = 0; //数据域存放链表长度
//返回指针
return head;
}
//遍历双向循环链表
void showdou(Douloop *head)
{
Douloop *p = head;
while(p->next != NULL)
{
p = p->next;
printf("%d ",p->msg.data);
}
putchar(10);
}
//头插法
void inserthead(Douloop *head,datatype num)
{
//创建一个新的节点
Douloop *temp =createdou();
//把数据存储到数据域中
temp->msg.data = num;
//头插法插入数据
//next
temp->next = head->next;
head->next = temp;
//prev
temp->prev = head;
if(temp->next != NULL)
temp->next->prev = temp;
//更新单链表的表长
head->msg.len++;
return ;
}
//尾插法
void inserttaril(Douloop *head,datatype num)
{
//创建一个新的节点
Douloop *temp =createdou();
//把数据存储到数据域中
temp->msg.data = num;
//找到尾节点(遍历)
Douloop *p = head;
while(p->next != NULL)
p=p->next;
//尾插法插入数据
//next
temp->next = p->next;
p->next = temp;
//prev
temp->prev = p;
//更新单链表的表长
head->msg.len++;
return ;
}
//头删
void delhead(Douloop *head)
{
//判断单链表是否为空
if(head->next == NULL)
{
printf("链表为空\n");
return;
}
//备份删除节点的地址
Douloop *temp=head->next;
//修改头结点指针域的指向
//next
head->next = temp->next;//head->next = head->next->next
//prev
head->next->prev = temp->prev;
//更新单链表的表长
head->msg.len--;
//释放节点
free(temp);
temp = NULL;
return;
}
//尾删
void deltrail(Douloop *head)
{
//判断单链表是否为空
if(head->next == NULL)
{
printf("链表为空\n");
return;
}
//找到倒数第二个数据节点
Douloop *p = head;
while(p->next->next != NULL)
p = p->next;
//修改倒数第二个数据结点指针域的指向
free(p->next); //释放尾节点
p->next = NULL; //倒数第二个数据节点的指针域指向空
//更新单链表的表长
head->msg.len--;
return;
}
//按位置插入
void insertloc(Douloop *head,int loc,datatype num)
{
//判断插入位置是否合法
if(loc<1)
{ //小于1的位置都非法
printf("位置非法\n");
return;
}
//找到要插入的位置的前一个位置
Douloop *p = head;
for(int i=0;i<loc-1;i++)
{
p = p->next;
if(p == NULL)
{
printf("位置非法\n");
return;
}
}
//创建一个新的数据节点
Douloop *temp =createdou();
//初始化数据节点
temp->msg.data = num; //将要插入的数据放到新数据节点的数据域中
//插入
//next
temp->next = p->next; //将自己的指针指向插入位置的节点
p->next = temp; //把插入位置前的节点指向自己
//prev
if(temp->next != NULL)
temp->next->prev = temp;
temp->prev = p;
//更新单链表的表长
head->msg.len++;
return;
}
//按位置删除
void delloc(Douloop *head,int loc)
{
//判断单链表是否为空
if(head->next == NULL)
{
printf("链表为空\n");
return;
}
//判断删除位置是否合法
if(loc<1)
printf("位置非法\n");
//找到要删除的位置的前一个位置
Douloop *p = head;
for(int i=0;i<loc-1;i++)
{
p = p->next;
if(p->next == NULL) //删除位置超出链表长度
{
printf("位置非法\n");
return;
}
}
//创建一个临时指针
Douloop *temp;
//删除
//next
temp = p->next; //将要删除的节点备份
p->next = temp->next; //将删除节点的前一个节点的指针指向删除节点的后一个节点
//prev
if(p->next != NULL)
p->next->prev = p;
free(temp);
temp = NULL;
//更新单链表的表长
head->msg.len--;
return;
}
单向
#include <stdio.h>
#include <stdlib.h>
#include "./looplinkfunc.h"
//创建单向循环链表
Looplink * createlooplink(void)
{
Looplink *head = (Looplink*)malloc(sizeof(Looplink));
if(head == NULL)
{
printf("失败\n");
return NULL;
}
//初始化节点
head->next = head; //让指针指向自己
head->msg.len = 0;
//返回指针
return head;
}
//头插法插入数据
void insertloop(Looplink *head,datatype num)
{
//创建一个新的节点
Looplink *temp =createlooplink();
//把数据存储到数据域中
temp->msg.data = num;
//头插法插入数据
temp->next = head->next;
head->next = temp;
//更新单链表的表长
head->msg.len++;
return ;
}
//头删
void delheadloop(Looplink *head)
{
//判断单链表是否为空
if(head->next == head)
printf("链表为空");
//备份删除节点的地址
Looplink *temp=head->next;
//修改头结点指针域的指向
head->next = temp->next;//head->next = head->next->next
//更新单链表的表长
head->msg.len--;
//释放临时指针
free(temp);
temp = NULL;
return;
}
//尾插法
void looptraillink(Looplink *head,datatype num)
{
//创建一个新的节点
Looplink *temp =createlooplink();
//把数据存储到数据域中
temp->msg.data = num;
//找到尾节点(遍历)
Looplink *p = head;
while(p->next != head)
p=p->next;
//尾插法插入数据
temp->next = p->next;
p->next = temp;
//更新单链表的表长
head->msg.len++;
return ;
}
//尾删
void loopdeltail(Looplink *head)
{
//判断单链表是否为空
if(head->next == head)
printf("链表为空");
//找到倒数第二个数据节点
Looplink *p = head;
while(p->next->next != head)
p = p->next;
//修改倒数第二个数据结点指针域的指向
free(p->next); //释放尾节点
p->next = head; //倒数第二个数据节点的指针域指向空
//更新单链表的表长
head->msg.len--;
}
//遍历单向循环链表
void showlooplink(Looplink *head)
{
Looplink *p = head;
while(p->next != head)
{
p = p->next;
printf("%d ",p->msg.data);
}
putchar(10);
}
//按位置插入
void locinsertloop(Looplink *head,int loc,datatype num)
{
//判断插入位置是否合法
if(loc<1)
printf("位置非法");
//找到要插入的位置的前一个位置
Looplink *p = head;
for(int i=0;i<loc-1;i++)
{
p = p->next;
if(NULL == head)
{
printf("位置非法");
return;
}
}
//创建一个新的数据节点
Looplink *temp = (Looplink *)malloc(sizeof(Looplink));
if(NULL == temp)
{
printf("失败");
return;
}
//初始化数据节点
temp->msg.data = num; //将要插入的数据放到新数据节点的数据域中
temp->next = NULL; //指针初始化为NULL
//插入
temp->next = p->next; //将自己的指针指向插入位置的节点
p->next = temp; //把插入位置前的节点指向自己
//更新单链表的表长
head->msg.len++;
return;
}
//按位置删除
void locdel(Looplink *head,int loc)
{
//判断单链表是否为空
if(head->next == head)
printf("链表为空");
//判断删除位置是否合法
if(loc<1)
printf("位置非法");
//找到要删除的位置的前一个位置
Looplink *p = head;
for(int i=0;i<loc-1;i++)
{
p = p->next;
if(p->next == head)
{
printf("位置非法");
return;
}
}
//创建一个临时指针
Looplink *temp;
//删除
temp = p->next; //将要删除的节点备份
p->next = temp->next; //将删除节点的前一个节点的指针指向删除节点的后一个节点
free(temp);
temp = NULL;
//更新单链表的表长
head->msg.len--;
return;
}