链表的基本操作,函数形式;
#include<stdio.h>
#include<stdlib.h>
typedef struct data{
int num; //数据域:存放数据
struct data *next; //指针域:存放关系,下一个节点地址
}Data;
Data *request_head_node(void) //创建头节点
{
Data *head = (Data *)malloc(sizeof(Data));
if(head == NULL)
{
printf("malloc head fail\n");
return NULL;
}
head->next = NULL;
return head;
}
Data *request_new_node(int data_num) //创建新结点
{
Data *new = (Data*) malloc(sizeof(Data));
if (new==NULL)
{
printf("malloc head fail\n");
return NULL;
}
new->num = data_num;
new->next = NULL; //要让指针指向NULL,不能成为野指针
return new;
}
int delete_node(Data *head,int delete_num) //删除节点
{
Data *p = NULL;
//找到要删除的节点
for(p=head;p->next!=NULL&&p->next->num!=delete_num;p=p->next);
/*循环结束有两种可能:
找到了:p->next!=NULL,p就是要删除节点的前一个节点,要删除节点是p的下一个节点
没找到:p->next==NULL*/
//让这个节点的前一个节点连接它的后一个节点
if(p->next != NULL)
{
//先记录下要删除节点的地址
Data *delete = p->next;
//连接要删除节点的前后节点,把要删除节点从链表中脱离
p->next = delete->next;
//释放这个节点的内存
free(delete);
return 0;//删除后直接返回0
}
return -1;//如果没找到就返回-1
}
void inset_to_head(Data *head,Data *new) //头插
{
new->next = head->next;//让新节点指向原本位于头节点后的节点
head->next = new;//再让头节点的后一个节点变成我们的新节点
}
void move_min(Data *head) //删除最小元素
{
Data * slow, * fast , * move;
if(head->next == NULL)
printf("当前链表无节点");
else{
slow = head;
fast = head->next;
move = head;
int min = fast->num;
while(fast != NULL){
fast = fast->next;
slow = slow->next;
if(fast != NULL && fast->num < min){
min = fast->num;
move = slow;
}
}
Data * temp = move->next;
move->next = temp->next;
free(temp);
}
}
void insert_increasing(Data *head,Data *new) //增序插入;
{
if(head->next == NULL)
head->next = new;
else{
Data * first = head->next;
Data * slow = head;
while(first != NULL){
if(new->num <= first->num){
slow->next = new;
new->next = first;
break;
}else{
first = first->next;
slow = slow->next;
}
}
if(first == NULL) {
slow->next = new;
new->next = NULL;
}
}
}
void print_link(Data *head) //打印链表
{
printf("head->");
head = head->next;
while(head)
{
printf("%d->",head->num);
head = head->next;
}
printf("NULL");
}
主函数可以自己写,调用函数就行,只实现了部分功能