双向链表
#include <stdio.h>
#include "./01_head.h"
#include <string.h>
#include <stdlib.h>
//创建双向链表
Seq* create_double_link()
{
Seq*head=(Seq*)malloc(sizeof(Seq));
memset(head,0,sizeof(Seq));
return head;
}
//创建节点
Seq*create_node()
{
Seq*temp=(Seq*)malloc(sizeof(Seq));
//初始化
memset(temp,0,sizeof(Seq));
return temp;
}
//插入-头插
void insert_link(Seq *head,int data)
{
Seq*temp=create_node();
if(temp==NULL)
{
printf("节点创建失败\n");
}
temp->txt.data=data;
temp->next=NULL;
temp->prev=NULL;
if(head->next==NULL)
{
temp->next=NULL;
head->next=temp;
temp->prev=head;
}
else
{
temp->next=head->next;
head->next=temp;
temp->next->next=NULL;
temp->next->prev=temp;
temp->prev=head;
}
head->txt.len++;
}
//插入-尾插
void insert_linkW(Seq*head,int data)
{
Seq*temp=create_node();
if(temp==NULL)
{
printf("节点创建失败\n");
}
temp->txt.data=data;
temp->next=NULL;
temp->prev=NULL;
Seq*p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=temp;
temp->prev=p;
head->txt.len++;
}
//按位置插入
void insert_link_x(Seq*head,int data,int pos)
{
if(pos<1 || pos>head->txt.len)
{
printf("位置插入有误\n");
}
Seq*p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
Seq*temp=create_node();
temp->txt.data=data;
temp->next=p->next;
p->next=temp;
temp->next->prev=temp;
temp->prev=p;
head->txt.len++;
}
//遍历
void show(Seq*head)
{
if(head->next==NULL)
{
printf("链表为空\n");
}
Seq*p=head;
while(p->next!=NULL)
{
printf("%4d",p->next->txt.data);
p=p->next;
}
printf("\n");
}
//删除-头删
void del_linkT(Seq*head)
{
Seq*temp=head->next;
if(head->next==NULL)
{
printf("链表为空\n");
}
if(temp->next==NULL)
{
head->next=NULL;
}
else
{
head=temp->next;
temp->next->prev=head;
}
free(temp);
head->txt.len--;
}
//删除-尾删
void del_linkW(Seq*head)
{
Seq*p=head;
if(head->next==NULL)
{
printf("链表为空");
}
while(p->next!=NULL)
{
p=p->next;
}
Seq*temp=p;
p->prev->next=NULL;
free(temp);
head->txt.len--;
printf("删除成功\n");
}
//中间删除
void del_link_Z(Seq*head,int pos)
{
if(pos<1||pos>head->txt.len+1)
{
printf("位置错误\n");
}
Seq*p=head;
for(int i=0;i<pos;i++)
{
p=p->next;
}
if(p->next==NULL)
{
p->prev->next=NULL;
}
else
{
p->prev->next=p->next;
p->next->prev=p->prev;
}
head->txt.len--;
free(p);
}
单向循环链表
#include <stdio.h>
#include <stdlib.h>
#include "./01_head.h"
//创建空单循环链表
Loop*create_double_link()
{
Loop*head=(Loop*)malloc(sizeof(Loop));
if(NULL==head)
{
printf("创建失败!\n");
return NULL;
}
head->txt.len=0;
head->next=head;
head->txt.len++; //更新长度
return head;
}
//插入数据—头插
void insert_linkT(Loop*head,int data)
{
//创建第一个节点
Loop*temp=(Loop*)malloc(sizeof(Loop));
if(NULL==temp)
{
printf("创建失败\n");
}
temp->txt.data=data;
temp->next=head->next;
head->next=temp;
printf("创建成功\n");
}
//插入数据-尾插
void insert_linkW(Loop *head,int data)
{
Loop *temp=(Loop*)malloc(sizeof(Loop));
Loop *p=head;
//初始化
temp->txt.data=data;
temp->next=head;
if(NULL==temp)
{
printf("创建失败\n");
}
while(p->next!=head)
{
p=p->next;
}
p->next=temp;
head->txt.len++;
printf("插入成功\n");
}
//遍历
void show(Loop *head)
{
Loop *p=head;
while(p->next!=head)
{
printf("%6d",p->next->txt.data);
p=p->next;
}
printf("\n");
}
//头删除
void del_linkT(Loop *head)
{
//判断链表是否为空
if(head->next==head)
{
printf("链表为空\n");
return ;
}
Loop *temp=head->next;
head->next=head->next->next;
free(temp);
printf("删除成功\n");
}
//尾删
void del_linkW(Loop*head)
{
if(head->next==head)
{
printf("链表为空\n");
return ;
}
Loop *p=head;
while(p->next->next!=head)
{
p=p->next;
}
Loop*temp=p->next;
p->next=head;
free(temp);
head->txt.len--;
printf("删除成功\n");
}