主文件
#include <stdio.h>
#include "./03_link_head.h"
int main(int argc, const char *argv[])
{
//接收创建的空单链表
linkList* head = create_link();
//头插法
/* head_cha(head,10);
head_cha(head,20);
head_cha(head,30);
head_cha(head,40);
head_cha(head,50); */
//尾插法
/* wei_cha(head,600);
wei_cha(head,700);
wei_cha(head,800); */
//头删法
/* bianli_link(head);
head_delete(head);
head_delete(head);
head_delete(head); */
//尾删法
/* wei_delete(head);
wei_delete(head); */
//按位置插入
/* wei_charu(head,1,111);
wei_charu(head,5,555);
wei_charu(head,8,99); */
//按位置删除
/* bianli_link(head);
weiz_delete(head,1);
weiz_delete(head,5);
weiz_delete(head,6); */
//直接插入排序
paixu(head,11);
paixu(head,33);
paixu(head,99);
paixu(head,22);
paixu(head,77);
//遍历链表
bianli_link(head);
//链表长度
printf("链表长度len= %d\n",head->text.len);
return 0;
}
调用的函数文件
#include <stdio.h>
#include <stdlib.h>
#include "./03_link_head.h"
//创建一个带头结点的空单链表
linkList* create_link(void)
{
//头结点
linkList* head = (linkList*)malloc(sizeof(linkList));
if(head == NULL)
{
printf("头结点为空,创建链表失败!\n");
return NULL;
}
head->text.len = 0; //初始化头结点的表长为0
head->next = NULL; //初始化指针域为空
return head;
}
//头插法
int head_cha(linkList* head, dataType num)
{
//创建一个新的节点
linkList* temp = (linkList*)malloc(sizeof(linkList));
if(temp == NULL)
{
printf("节点创建失败,请重新创建!\n");
return -1;
}
//初始化
temp->text.data = num;
temp->next = NULL;
//头插法的方式
temp->next = head->next;
head->next = temp;
head->text.len++;
printf("头插法成功\n");
return 0;
}
//尾插法
void wei_cha(linkList *head, dataType num)
{
//创建新节点
linkList* temp =(linkList*)malloc(sizeof(linkList));
if(temp == NULL)
{
printf("节点创建失败,请重新创建!\n");
return;
}
//初始化
temp->next = NULL;
temp->text.data = num;
//尾插法的方式
linkList* p = head;
while(p->next != NULL) //查找链表尾部节点
{
p = p->next;
}
p->next = temp;
//更新链表长度
head->text.len++;
}
//判断链表是否为空
int link_kong(linkList* head)
{
//为空返回-1,不为空返回0
return head->next==NULL ? -1 : 0;
}
//头删法
dataType head_delete(linkList* head)
{
//判断链表是否为空
if( link_kong(head) )
{
printf("链表为空,无法删除!\n");
return -1;
}
//头删方式
linkList* temp = head->next;
head->next = temp->next;
//另存删除的节点,然后释放节点
dataType num = temp->text.data;
printf("删除的节点num = %d\n",num);
free(temp);
temp = NULL;
head->text.len--;
return num;
}
//尾删法
dataType wei_delete(linkList* head)
{
//判断链表是否为空
if( link_kong(head) )
{
printf("链表为空,无法删除!\n");
return -1;
}
linkList* temp = head;
//循环找倒数第二个节点
while(temp->next->next != NULL)
{
temp = temp->next;
}
//另存为
dataType num = temp->next->text.data;
printf("删除的尾节点num = %d\n",num);
//释放
free(temp->next);
temp->next = NULL;
head->text.len--;
return num;
}
//按位置插入
void wei_charu(linkList* head, int pos, dataType num)
{
//判断位置是否合法
if(pos < 1 || pos > head->text.len+1)
{
printf("插入失败,位置非法!\n");
return;
}
linkList* p = head;
//p存储插入的位置前一个节点的地址
for(int i = 0; i < pos-1; i++)
{
p = p->next;
}
//创建新节点
linkList* temp =(linkList*)malloc(sizeof(linkList));
if(temp == NULL)
{
printf("节点创建失败,请重新创建!\n");
return;
}
temp->text.data = num;
temp->next = NULL;
//插入节点
temp->next = p->next;
p->next = temp;
head->text.len++;
}
//按位置删除
dataType weiz_delete(linkList* head, int pos)
{
//判断链表是否为空
if( link_kong(head) )
{
printf("链表为空,无法删除!\n");
return -1;
}
//判断位置是否合法
if(pos <= 0 || pos > head->text.len)
{
printf("删除失败,位置非法!\n");
return -1;
}
linkList* p = head;
//p存储插入的位置前一个节点的地址
for(int i = 0; i<pos-1; i++)
{
p = p->next;
}
//另存删除的节点
linkList* temp = p->next;
p->next = temp->next;
dataType num = temp->text.data;
printf("删除的节点num = %d\n",num);
free(temp);
temp = NULL;
head->text.len--;
return num;
}
//直接插入排序
void paixu(linkList* head, dataType num)
{
//创建一个新的节点
linkList* temp = (linkList*)malloc(sizeof(linkList));
if(temp == NULL)
{
printf("创建失败,链表为空!\n");
return;
}
temp->text.data = num;
temp->next = NULL;
//遍历链表,找比num大的前一个的位置
linkList* p =head;
while(p->next != NULL)
{
if(p->next->text.data > temp->text.data) //从小到大
break;
else
{
p= p->next;
}
}
//在p的位置插入数据
temp->next = p->next;
p->next = temp;
head->text.data++;
return;
}
//遍历链表
void bianli_link(linkList* head)
{
linkList* p = head;
while(p->next != NULL)
{
p = p->next;
printf("%d ",p->text.data);
}
printf("\n");
return;
}
头文件
#ifndef __linkList_h__
#define __linkList_h__
typedef int dataType; //由于应用中不一定为int类型,所以重名为dataTppe
//使用联合体存储数据域信息
union msg{
dataType data; //有效数据节点
int len; //头结点的表长
};
//由于节点中的指针域要指向下一个节点,所以必须使用有名结构体
typedef struct node{
//数据域: 若是头结点,则使用text里的len,
// 若是有效数据节点,则使用text里的data
union msg text;
struct node* next; //指针域,存储下一个节点的地址
}linkList;
//创建一个带头结点的空单链表
linkList* create_link(void);
//头插法
int head_cha(linkList* head, dataType num);
//尾插法
void wei_cha(linkList *head, dataType num);
//遍历链表
void bianli_link(linkList* head);
//头删法
dataType head_delete(linkList* head);
//尾删法
dataType wei_delete(linkList* head);
//按位置插入
void wei_charu(linkList* head, int pos, dataType num);
//按位置删除
dataType weiz_delete(linkList* head, int pos);
//直接插入排序
void paixu(linkList* head, dataType num);
#endif
makefile
-include ./makefile.cfg
$(target): $(obj) #最上面放最终要形成的文件
$(pgcc) $^ -o $@
%.o:%.c
$(pgcc) $< $(can) $@
.PHONY: clean
clean:
rm $(obj)
target:=a.out
obj:=01_main.o 02_link.o
pgcc:=gcc
can:=-c -o