函数模块
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "clinklist.h"
// 1.创建头结点
CLinklist *Create_CLinklist() //创建头结点
{
CLinklist *head;
head=(CLinklist *)malloc(sizeof(CLinklist));
if(NULL== head){
printf("创建失败!!\n");
}
head->data=-2;
head->next = head;
return head;
}
// 2.判断是否为空链表
int CLinklist_Is_Emp(CLinklist *head)
{
if(head->next == head){
printf("该链表为空链表\n");
return 1;
}
return 0;
}
// 3.计算链表长度、
int CLinklist_Length(CLinklist *head)
{
int len=0;
CLinklist *p=head->next;
while(p != head){
p = p->next;
len++;
}
return len;
}
// 增
// 4.从头插入元素
void CLinklist_In_Head(CLinklist *head,data_d New_data)
{
CLinklist *new=(CLinklist *)malloc(sizeof(CLinklist)); //为新结点创建空间
new->data=New_data;
if(NULL == new){
printf("创建失败!");
return;
}
//插入操作
new->next = NULL;
new->next = head->next;
head->next = new; // 将新结点的首地址赋值给头结点的next
}
// 12.打印链表元素
void CLinkelist_Show(CLinklist *head)
{
int i=CLinklist_Length(head);
CLinklist *q=head->next;
while(q != head){ // 循环整个链表
printf("%d ",q->data);
q=q->next;
}
printf("\n");
return;
}
// 连接两个链表
CLinklist *CLinklist_Connect(CLinklist *head,CLinklist *head1)
{
CLinklist *p=head;
CLinklist *q=head1;
while(p->next != head)
{
p=p->next;
}
while(q->next != head1)
{
q=q->next;
}
CLinklist *k=q->next;
q->next = p->next;
p->next = k->next;
head1->next=head1;
return head;
}
//按位置插入
void CLinklist_Add_Pos(CLinklist *head,int pos,data_d New_data)
{
CLinklist *new=(CLinklist *)malloc(sizeof(CLinklist));
CLinklist *p=head;
CLinklist *q;
int i=0;
i=pos-1;
while(i--){
p=p->next;
}
new->data = New_data;
q=p;
new->next = p->next;
q->next = new;
return;
}
//按位置删除链表中的元素
void CLinklist_Detele_Pos(CLinklist *head,int pos)
{
CLinklist *p=head;
CLinklist *q;
CLinklist *k;
int i=pos-1;
while(i--){
p=p->next;
}
q=p;
k=p->next;
q->next=p->next->next;
free(k);
}
//joseph
void CLinklist_Joseph(CLinklist *head,int pos,int M)
{
CLinklist *p=head;
CLinklist *q;
CLinklist *k;
int j=CLinklist_Length(head);
while(M--){
p=p->next;
}
while(j--){
q=p;
k=q->next;
printf("%d ",q->next->data);
p->next=q->next->next;
p=p->next->next;
free(k);
}
printf("%d \n",p->data);
printf("------------");
return;
}
函数声明模块
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef int data_d;
typedef struct linklist
{
data_d data;
struct linklist *next;
}CLinklist;
// 1.创建头结点
CLinklist *Create_Linklist(); //创建头结点
//2.判断是否为空链表
int CLinklist_Is_Emp(CLinklist *Linklist);
// 3.计算链表长度、
int CLinklist_Length(CLinklist *Linklist);
//增
//4.从头插入元素
void CLinklist_In_Head(CLinklist *Linklist,data_d New_data);
// 12.打印链表元素
void CLinkelist_Show(CLinklist *head);
//连接两个链表
CLinklist *CLinklist_Connect(CLinklist *head,CLinklist *head1);
//按位置插入
void CLinklist_Add_Pos(CLinklist *head,int pos,data_d New_data);
//按位置删除链表中的元素
void CLinklist_Detele_Pos(CLinklist *head,int pos);
//joseph
void CLinklist_Joseph(CLinklist *head,int pos,int M);
#endif
主函数模块
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "clinklist.h"
int main()
{
CLinklist *head = (CLinklist *)Create_CLinklist();//构建一个头结点
int n=10;
while(n--){
CLinklist_In_Head(head,n); //从头部依次插入10个数
}
CLinkelist_Show(head);// 打印链表
int a;
a=CLinklist_Length(head);
printf("%d\n",a);
CLinklist *head1 = (CLinklist *)Create_CLinklist();//构建一个头结点
n=10;
while(n--){
CLinklist_In_Head(head1,n); //从头部依次插入10个数
}
CLinkelist_Show(head1);// 打印链表
CLinklist_Joseph(head,3,3);//约瑟夫算法
CLinklist_Add_Pos(head,11,66);//向第5为位置添加一个值为66的元素
CLinkelist_Show(head);// 打印链表
CLinklist_Detele_Pos(head,7);//删除第7个元素
CLinkelist_Show(head);// 打印链表
CLinklist *head2 = CLinklist_Connect(head,head1);
CLinkelist_Show(head2);// 打印链表
return 0;
}