#include<stdio.h>
#include<stdlib.h>
typedef int LinkType;
typedef struct LinkNode{
LinkType data;
struct LinkNode *next;
}LinkList;
//链表初始化
void Linklistinit(LinkList **head)
{
if (head == NULL)//输入不合法
return;
*head = NULL;
}
//链表尾部插入
void LinkListPushBack(LinkList **head, LinkType valve)
{
LinkNode *new_Node = (LinkNode *)malloc(sizeof(LinkNode));
new_Node->data = valve;
new_Node->next = NULL;
LinkNode *cur = *head;
if (head == NULL)//输入不合法
return;
if ((*head) == NULL)//链表为空
{
*head = new_Node;
}
else
{
while (cur->next != NULL)
cur = cur->next;
cur->next = new_Node;
}
}
//删除链表尾部元素
void LinkListPopBack(LinkNode** head)
{
LinkNode *cur = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
if ((*head)->next == NULL)
{
free(*head);
*head = NULL;
}
else
{
while (cur->next->next != NULL)
cur = cur->next;
free(cur->next);
cur->next = NULL;
}
}
//打印链表
void print(LinkList *head)
{
LinkNode *cur = head;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
}
//链表头插
void LinkListPushFront(LinkNode** head, LinkType value)
{
LinkNode *new_Node = (LinkNode *)malloc(sizeof(LinkNode));
new_Node->data = value;
new_Node->next = NULL;
if (head == NULL)
return;
if (*head == NULL)
{
*head = new_Node;
}
else
{
new_Node->next = *head;
*head =new_Node;
}
}
//链表头删
void LinkListPopFront(LinkNode** head)
{
LinkNode *cur = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
if ((*head)->next==NULL)
{
free(*head);
*head = NULL;
}
else
{
cur = cur->next;
free(*head);
*head = cur;
}
}
//查找元素在链表中的位置 ,返回这个值对应的节点地址
LinkNode* LinkListFind(LinkNode* head, LinkType to_find)
{
LinkNode *cur = head;
if (head == NULL)
return NULL;
else
{
while (cur != NULL)
{
if (cur->data == to_find)
return cur;
cur = cur->next;
}
}
return NULL;
}
//在指定pos节点的前面插入新节点
void LinkListInsertFront(LinkNode** head, LinkNode* pos, LinkType value)
{
LinkNode *cur = *head;
if (head == NULL)
return; //不合法
if (*head == NULL)
return;//链表为空
LinkNode *new_Node = (LinkNode *)malloc(sizeof(LinkNode));
new_Node->data = value;
new_Node->next = NULL;
if (*head == pos) //如果pos是头结点
{
new_Node->next = *head;
*head = new_Node;
}
else //如果pos不是头结点
{
while (cur->next != pos)
cur = cur->next;
if (cur->next != NULL) //找到pos
{
new_Node->next = cur->next;
cur->next = new_Node;
}
else //没有找到pos
{
return;
}
}
}
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value)
{
LinkNode *cur = *head;
if (head == NULL)
return;
LinkNode *new_Node = (LinkNode *)malloc(sizeof(LinkNode));
new_Node->data = value;
new_Node->next = NULL;
if (*head == pos)
{
new_Node->next = (*head)->next;//这两句话不能换位置
(*head)->next = new_Node; //
}
else
{
while (cur != pos)
cur = cur->next;
if (cur != NULL)
{
new_Node->next = cur->next;//
cur->next = new_Node;
}
}
}
void LinkListErase(LinkNode** head, LinkNode* pos)
{//链表只有一个节点,pos是该节点,pos不是该节点
//链表不止一个节点,pos是头节点,pos不是头结点
LinkNode *cur = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
if ((*head)->next == NULL)
{
if (*head == pos)
{
free(*head);
*head = NULL;
}
else
return;
}
else
{
if (*head == pos)
*head = cur->next;
else
{
while (cur->next != pos)
cur = cur->next;
if (cur->next != NULL) //
{
pos = cur->next;
cur->next = pos->next;
free(pos);
}
else
return;
}
}
}
void LinkListRemove(LinkNode** head, LinkType to_delete)
{
LinkNode *cur = *head, *dele;
if (head == NULL)
return;
if (*head == NULL)
return;
if ((*head)->data == to_delete)
{
if ((*head)->next == NULL)
{
free(*head);
*head = NULL;
}
else
{
dele = *head;
*head = cur->next;
free(dele);
}
}
else
{
while (cur->next != NULL && cur->next->data != to_delete)//如果要查的数不存在
cur = cur->next;
if (cur->next != NULL)
{
dele = cur->next;
cur->next = cur->next->next;
free(dele);
}
else
return;
}
}
int LinkListEmpty(LinkNode* head)
{
if (head == NULL)
return 1;
else
return 0;
}
int main()
{
int a;
LinkList *L,*d;
Linklistinit(&L);
LinkListPushBack(&L, 9);
LinkListPushBack(&L, 5);
LinkListPushBack(&L, 7);
LinkListPopBack(&L);
LinkListPopFront(&L);
LinkListPopFront(&L);
d=LinkListFind(L,99);
printf("%d ", d);
LinkListPushFront(&L, 6);
LinkListInsertFront(&L, L->next->next, 6);
LinkListInsertAfter(&L, L->next->next->next, 6);
LinkListErase(&L, L->next->next);
LinkListRemove(&L, 7);
a=LinkListEmpty(L);
printf("%d", a);
print(L);
system("pause");
return 0;
}
单链表基本算法
最新推荐文章于 2022-10-13 09:52:00 发布