一、双向链表:创建双链表、从头部插入数据、从尾部插入数据、任意位置插入数据、从头部删除、从尾部删除、从任意位置删除、遍历双链表、判段链表是否为空
1、03_linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "./03_linklist.h"
doublelinklist* create_doubleLInklist(void)
{
doublelinklist* head = (doublelinklist*)malloc(sizeof(doublelinklist));
if(NULL == head)
{
printf("申请空间失败,创建链表失败\n");
return NULL;
}
head->next = NULL;
head->prev = NULL;
head->text.len = 0;
return head;
}
//头插
void head_Insertlinklist(doublelinklist* head,dataType num)
{
doublelinklist* p = head;
doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
if(NULL == temp)
{
printf("申请空间失败!");
return;
}
temp->text.data = num;
temp->next = NULL;
temp->prev = NULL;
//链表为空和链表中有数据时头插位置不一样
if(Empty(head) == 1)
{
temp->next = p->next;
p->next = temp;
temp->prev = p;
}
else
{
temp->next = p->next;
p->next = temp;
temp->prev = p;
temp->next->prev = temp;
}
head->text.len++;
}
//判空(空:1,不空:0)
int Empty(doublelinklist* head)
{
if(NULL == head->next)
{
return 1;
}
else
{
return 0;
}
}
//尾插
void tail_InsertLinklist(doublelinklist* head,dataType num)
{
doublelinklist* p = head;
doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
if(NULL == temp)
{
printf("申请空间失败!");
return;
}
temp->text.data = num;
temp->next = NULL;
temp->prev = NULL;
if(1 == Empty(head))//空链表
{
temp->next = p->next;
p->next = temp;
// temp->next = NULL;
temp->prev = p;
}
else
{
//遍历出最后一个元素位置
while(p->next!= NULL)
{
p=p->next;
}
temp->next = p->next;
p->next = temp;
// temp->next = NULL;
temp->prev = p;
}
head->text.len++;
}
//遍历
void show_doubleLinklist(doublelinklist* head)
{
doublelinklist* p = head;
while(NULL != p->next)
{
p=p->next;
printf("%d ",p->text.data);
}
printf("\n");
}
//按位置插入
void insertDouobleLinklist(doublelinklist* head,int n,dataType num)
{
doublelinklist* p = head;
int i;
doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
if(NULL == temp)
{
printf("申请空间失败!");
return;
}
if(n<1 && n>head->text.len+1)
{
printf("插入位置非法,插入失败\n");
return;
}
for(i=0;i<n-1;i++)
{
p=p->next;
}
temp->text.data = num;
temp->next = NULL;
temp->prev = NULL;
if(p->next == NULL)
{
temp->next = p->next;
p->next = temp;
temp->prev = p;
}
else
{
temp->next = p->next;
p->next = temp;
temp->next->prev = temp;
temp->prev = p;
}
head->text.len++;
}
//头删
void head_DeleteDoubleLinklist(doublelinklist* head)
{
doublelinklist* p = head;
doublelinklist* q = p->next;
if(NULL == p->next)
{
printf("该链表为空,无法进行删除操作\n");
return;
}
if(q->next == NULL)
{
p->next = q->next;
free(p);
}
else
{
p->next = q->next;
q->next->prev = p;
free(q);
}
printf("头删成功\n");
head->text.len--;
}
//尾删
void tail_DeleteDoubleLinklist(doublelinklist* head)
{
doublelinklist* p = head;
if(NULL == p->next)
{
printf("该链表为空,无法进行删除操作\n");
return;
}
while(p->next != NULL)
{
p = p->next;
}
p->prev->next = NULL;
free(p);
head->text.len--;
printf("尾删成功\n");
}
//按位置删除
void deleteDoubleLinklist(doublelinklist* head,int n)
{
doublelinklist* p = head;
if(NULL == p->next)
{
printf("该链表为空,无法进行删除操作\n");
return;
}
int i;
for(i=0;i<n;i++)
{
p = p->next;
}
if(p->next == NULL)
{
p->prev->next = p->next;
free(p);
}
else
{
p->prev->next = p->next->next;
p->next->prev = p->prev;
free(p);
}
head->text.len--;
printf("按位删除成功\n");
}
2、03_main.c
#include <stdio.h>
#include "./03_linklist.h"
int main(int argc, const char *argv[])
{
doublelinklist* head = create_doubleLInklist();
head_Insertlinklist(head,2);
tail_InsertLinklist(head,3);
tail_InsertLinklist(head,4);
tail_InsertLinklist(head,5);
show_doubleLinklist(head);
//按位置插入
insertDouobleLinklist(head,3,4);
show_doubleLinklist(head);
//头删
head_DeleteDoubleLinklist(head);
//尾删
tail_DeleteDoubleLinklist(head);
//按位置删除
deleteDoubleLinklist(head,3);
return 0;
}
3、03_linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef int dataType;
union msg
{
dataType data;
int len;
};
typedef struct node
{
union msg text;
struct node* next;
struct node* prev;
}doublelinklist;
//创建双向链表
doublelinklist* create_doubleLInklist(void);
//头插
void head_Insertlinklist(doublelinklist* head,dataType num);
//尾插
void tail_InsertLinklist(doublelinklist* head,dataType num);
//遍历
void show_doubleLinklist(doublelinklist* head);
//判空(空:1,不空:0)
int Empty(doublelinklist* head);
//按位置插入
void insertDouobleLinklist(doublelinklist* head,int n,dataType num);
//按位置删除
void deleteDoubleLinklist(doublelinklist* head,int n);
//尾删
void tail_DeleteDoubleLinklist(doublelinklist* head);
//头删
void head_DeleteDoubleLinklist(doublelinklist* head);
#endif
二、单循环链表:创建单向循环链表、头插链表、尾插链表、按位置插入链表、按位置查找链表、头删、尾删、遍历链表、判断链表是否为空
1、02_linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "./02_linklist.h"
//创建单向循环链表
looplinklist* create_Looplinklist(void)
{
looplinklist* head = (looplinklist*) malloc(sizeof(looplinklist));
if(NULL == head)
{
printf("节点创建失败,链表创建失败\n");
return NULL;
}
//初始化
head->text.len=0;
//循环链表初始化头结点的next指向自身
head->next = head;
return head;
}
//头插
void head_InsertLooplinklist(looplinklist* head,dataType num)
{
looplinklist* temp = (looplinklist*) malloc(sizeof(looplinklist));
if(NULL == temp)
{
printf("创建节点失败!\n");
return;
}
//初始化节点
temp->text.data = num;
temp->next = NULL;
looplinklist* p = head;
temp->next = p->next;
p->next = temp;
head->text.len++;
}
//尾插
void tail_InsertLoopLinklist(looplinklist* head,dataType num)
{
looplinklist* temp = (looplinklist*)malloc(sizeof(looplinklist));
if(NULL == temp)
{
printf("创建节点失败!\n");
return;
}
//初始化节点
temp->text.data = num;
temp->next = NULL;
looplinklist* p = head;
while(p->next!=head)
{
p=p->next;
}
p->next = temp;
temp->next = head;
head->text.len++;
}
//遍历
void show_Looplinklist(looplinklist* head)
{
looplinklist* p = head;
while(p->next!=head)
{
p=p->next;
printf("%d ",p->text.data);
}
printf("\n");
}
//判空
int Empty(looplinklist* head)
{
looplinklist* p = head;
if(p->next == head)
{
return 1;
}
else
{
return 0;
}
}
//头删
void head_deletLoopLinklist(looplinklist* head)
{
looplinklist* p = head;
looplinklist* q = head->next;
if(Empty(head) == 1)
{
printf("此单向循环链表为空,无法进行删除操作\n");
return;
}
p->next = q->next;
free(q);
q=NULL;
head->text.len--;
printf("头删完成\n");
}
//尾删
void tail_deleteLoopLinklist(looplinklist* head)
{
looplinklist* p = head;
if(Empty(head) == 1)
{
printf("此单向循环链表为空,无法进行删除操作\n");
return;
}
while(p->next->next!=head)
{
p=p->next;
}
looplinklist* q = p->next;
p->next = q->next;
free(q);
head->text.len--;
printf("尾删完成\n");
q=NULL;
}
//定位插入
void insert_LoopLinklist(looplinklist* head,dataType num,int n)
{
looplinklist* temp = (looplinklist*)malloc(sizeof(looplinklist));
if(NULL == temp)
{
printf("申请空间失败,创建新节点失败\n");
return;
}
//初始化新节点
temp->text.data = num;
temp->next = NULL;
looplinklist* p = head;
int i;
for(i=0;i<n;i++)
{
p=p->next;
}
if(NULL == p->next)
{
p->next = temp;
temp->next = head;
}
else
{
temp->next = p->next;
p->next = temp;
}
head->text.len++;
}
//定位查看
void select_LoopLinklist(looplinklist* head,int n)
{
looplinklist* p = head;
int i;
for(i=0;i<n;i++)
{
p = p->next;
}
printf("查看的第%d为元素值为:%d\n",n,p->text.data);
p=NULL;
}
//
//
//约瑟夫问题
void joseph(looplinklist* head,int n,int m,int k)
{
looplinklist* p = head;
looplinklist* p1 = head;
looplinklist* q = NULL;
//删除头结点
if (p == head)
{
if (head->next == head)
{ // 只有一个节点的情况
free(head);
head = NULL;
}
else
{
p1 = head;
while (p1->next != head)
{
p1 = p1->next;
}
p1->next = head->next;
free(head);
head = p1->next;
}
}
//p2指向新的头节点
looplinklist* p2 = head;
//循环
int i;
//p2定位到数据3,开始的地方
for(i=1;i<k;i++)
{
q = p2;
p2 = p2->next;
}
while(n>0)
{
for(i=1;i<m;i++)//6
{
q = p2;
p2 = p2->next;
}
printf("%d ",p2->text.data);
if(p2 == q)
{
head = NULL;
}
else
{ //删除节点
q->next = p2->next;
head = p2->next;
}
free(p2);
p2 = head;
n--;
}
printf("\n");
}
2、02_main.c
#include <stdio.h>
#include <stdlib.h>
#include "./02_linklist.h"
int main(int argc, const char *argv[])
{
//创建单项循环链表
looplinklist* head = create_Looplinklist();
//头插
int i=1;
for(i=8;i>=1;i--)
{
head_InsertLooplinklist(head,i);
}
//遍历
show_Looplinklist(head);
//尾插
// tail_InsertLoopLinklist(head,12);
// show_Looplinklist(head);
//头删
// head_deletLoopLinklist(head);
// show_Looplinklist(head);
// joseph(head,8,4,3);
//尾删
tail_deleteLoopLinklist(head);
//定位插入
insert_LoopLinklist(head,12,5);
show_Looplinklist(head);
//定位查看
select_LoopLinklist(head,5);
3、02_linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef int dataType;
union msg
{
dataType data;
int len;
};
typedef struct node
{
union msg text;
struct node* next;
}looplinklist;
//创建单向循环链表
looplinklist* create_Looplinklist(void);
//头插
void head_InsertLooplinklist(looplinklist* head,dataType num);
//遍历
void show_Looplinklist(looplinklist* head);
//尾插
void tail_InsertLoopLinklist(looplinklist* head,dataType num);
//头删
void head_deletLoopLinklist(looplinklist* head);
//约瑟夫问题
void joseph(looplinklist* head,int n,int m,int k);
//尾删
void tail_deleteLoopLinklist(looplinklist* head);
//定位插入
void insert_LoopLinklist(looplinklist* head,dataType num,int n);
//定位查看
void select_LoopLinklist(looplinklist* head,int n);
#endif