#include <stdio.h>
#include <stdlib.h>
#include "./02_linklist.h"
Linklist* create_link()
{
Linklist* head = (Linklist*)malloc(sizeof(Linklist));
if(NULL == head)
{
printf("创建头结点失败\n");
return NULL;
}
head->msg.len = 0; //有效结点个数为0;
head->next = NULL; //空的单链表,先让头结点指向空
return head;
}
void insert_linkFront(Linklist* head, datatype data)
{
//创建一个结点
Linklist* temp = (Linklist*)malloc(sizeof(Linklist));
if(NULL == temp)
{
printf("创建失败,插入数据失败\n");
return;
}
//初始化该结点
temp->next = NULL;
temp->msg.data = data;
temp->next = head->next; //让新的结点指向head后面的第一个结点
head->next = temp; //让head指向temp;
head->msg.len++; //更新长度
return;
}
void show_linklist(Linklist* head)
{
if(NULL == head)
{
printf("链表错误\n");
return ;
}
Linklist * p = head->next;
while(p != NULL)
{
printf("%d\t", p->msg.data);
p= p->next;
}
putchar(10);
return ;
}
/*
* function: 列表翻转
* @param [ in]
* @param [out]
* @return
*/
void overturn_linklist(Linklist* head)
{
if(NULL == head->next || NULL == head)
{
printf("链表为空,或者非法\n");
return;
}
Linklist* p ,*q;
p = head->next;
head->next = NULL; //独立出头结点
while(p != NULL)
{
q = p->next;
//头插法插入数据
p->next = head->next;
head->next = p;
p = q;
}
return;
}
* function: 快慢指针
* @param [ in]
* @param [out]
* @return
*/
Linklist* find_listMiddleNode(Linklist* head)
{
if(NULL == head->next)
{
printf("链表为空\n");
return NULL;
}
Linklist* slow , *fast;
slow = fast = head->next;
while(fast!=NULL && fast->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
linklist.h [+] 31,49 96% 02_main.c
#include <stdio.h>
#include <stdlib.h>
#include "./02_linklist.h"
/*
* function: 单项循环列表的创建
* @param [ in]
* @param [out]
* @return
*/
Loop* create_looplinklist()
{
Loop* head = (Loop*)malloc(sizeof(Loop));
if(NULL == head)
{
printf("创建失败\n");
return NULL;
}
head->msg.len = 0;
head->next = head;
return head;
}
/*
* function: 尾插法
* @param [ in]
* @param [out]
* @return
*/
void insert_looptail(Loop* head, datatype data)
{
Loop* temp = (Loop*)malloc(sizeof(Loop));
if(NULL == temp)
{
printf("创建失败\n");
return;
}
temp->msg.data = data;
temp->next = NULL;
Loop* p = head;
while(p->next!=head)
{
p=p->next;
}
temp->next = p->next;
p->next = temp;
head->msg.len++;
return;
}
/*
* function: 遍历
* @param [ in]
* @param [out]
* @return
*/
void show_looplinklist(Loop* head)
{
Loop* p = head;
while(p->next!=head)
{
p = p->next;
printf("%d\t", p->msg.data);
}
putchar(10);
return;
}
/*
* function: 头删
* @param [ in]
* @param [out]
* @return
*/
datatype delete_looplinkFront(Loop* head)
{
if(NULL == head->next || NULL == head)
{
printf("删除失败\n");
return (datatype) -1;
}
Loop* temp = head->next;
head->next = head->next->next;
head->msg.len--;
datatype data = temp->msg.data;
free(temp);
temp = NULL;
return data;
}
/*
* function: 尾删
* @param [ in]
* @param [out]
* @return
*/
datatype delete_looplinktail(Loop* head)
{
if(head == head->next)
{
printf("删除失败\n");
return (datatype)-1;
}
Loop* p = head;
while(p->next->next!=head)
{
p=p->next;
}
datatype data = p->next->msg.data;
free(p->next);
p->next = head;
1 #include <stdio.h>
2 #include "./02_linklist.h"
3 #include <stdlib.h>
4 int main(int argc, const char *argv[])
5 {
6 int n = 8;
7 int k = 3;
8 int m = 4;
9
0 Loop* head = create_looplinklist();
1
2 for(int i=1; i<=n; i++)
3 {
4 insert_looptail(head, i);
5 }
6
7
8 Loop* p = head;
9 while(p->next != head)
0 {
1 p = p->next;
2 }
3 p->next = head->next;
4
5 p = head;
6 head = head->next;
7 free(p);
8
9 p = head;
0 for(int i=0; i<k-1; i++)
1 {
2 p = p->next;
3 }
4
5
6 while(p->next != p)
7 {
8 for(int i=0; i<m-2; i++)
9 {
0 p = p->next;
1 }
2 Loop* temp = p->next;
3 p->next = temp->next;
4 printf("%d ", temp->msg.data);
5 free(temp);
6
7 p = p->next;
8 }
9
0 printf("%d\n", p->msg.data);
1 free(p);
2
3
4 return 0;
5 }