声明头文件创建结点数据类型:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int data_t; //定义链表所需的数据类型
typedef struct Str //定义结点数据类型
{
data_t data;
struct Str *per;
struct Str *next;
}noer_r;
创建头结点:
noer_r *Create(void) //定义函数Create函数用于创建头结点
{
noer_r *head;
head=malloc(sizeof(noer_r)); //动态开辟头结点的存储空间
if(head==NULL) //判断空间是否开辟成功
return NULL;
memset(head,0,sizeof(noer_r)); //将头结点空间清零
head->next=head; //定义结点后继指针指向
head->per=head; //定义结点前驱指针指向
return head;
}
增加/插入结点:
int Insert(noer_r *head,int loca,data_t da) //定义函数Insert按位置插入结点
{
if(head==NULL) //判断头结点是否存在
return -1;
noer_r *p=head;
noer_r *q;
for(int i=0;i<loca;i++) //找需要插入结点的前一个结点
{
p=p->next;
if(p==NULL) //说明p已经是链表中最后一个结点下一个结点,插入失败
return -1;
}
q=malloc(sizeof(noer_r)); //创建插入的结点空间
if(q==NULL)
return -1;
/* 插入结点 */
q->data=da;
q->next=p->next;
p->next=q;
q->next->per=q;
q->per=p;
return 0;
}
遍历链表并输出结点数据:
int Traverse_output(noer_r *head) //定义Traverse_output函数遍历链表并输出各链表结点的数据
{
if(head==NULL)
return -1;
noer_r *p=head->next; //定义指针存储起始有效数据结点的地址
while(p!=head) //p ==head,说明已回到头结点,整个链表遍历完成
{
printf("%d ",p->data); //访问当前结点的数据
p=p->next;
}
printf("\n");
return 0;
}
删除结点:
int Delete_Vertex(noer_r *head,int loca) //创建Delete_Vertex函数按位置删除结点
{
if(head==NULL)
return -1;
if(head->next==NULL)
return -1;
noer_r *p=head->next;
for(int i=0;i<=loca;i++) //找到所需要删除的结点
{
p=p->next;
}
/*删除p结点*/
p->per->next=p->next;
p->next->per=p->per;
free(p);
return 0;
}
修改指定位置结点数据:
int change(noer_r *head,int loca,data_t mydata) //创建change函数对指定位置结点的数据进行修改
{
if(head==NULL)
return -1;
if(head->next==NULL)
return -1;
noer_r *p=head->next;
for(int i=0;i<=loca;i++) //找到需要修改数据的结点
{
p=p->next;
}
p->data=mydata; //修改结点数据
return 0;
}
查找指定位置结点数据并输出:
int check(noer_r *head,int loca) //创建check函数查找指定位置结点,并将结点数据输出
{
if(head==NULL)
return -1;
if(head->next==NULL)
return -1;
noer_r *p=head;
for(int i=0;i<=loca;i++) //找到想要查询位置的结点
{
p=p->next;
}
printf("第%d个结点的数据为:%d\n",loca,p->data);
return 0;
}
销毁链表:
int Destruction(noer_r **head) //创建Destruction函数销毁链表
{
if(*head==NULL)
return -1;
noer_r *p=(*head)->next;
noer_r *q;
while(p!=*head) //遍历链表,逐一将结点删除并释放结点资源空间
{
q=p;
p=p->next;
free(q);
}
free(*head);
*head=NULL;
return 0;
}