#include <stdio.h>
#include "./fun.h"
int main(int argc, const char *argv[])
{
datatype num;
linkList* head=create_linkList();
insertHead_linkList(head,100);
insertHead_linkList(head,10);
insertHead_linkList(head,199);
insertHead_linkList(head,79);
insertHead_linkList(head,23);
insertHead_linkList(head,32);
show_linkList(head);
printf("-----------------------------\n");
insertTail_linkList(head,45);
insertTail_linkList(head,67);
insertTail_linkList(head,89);
insertTail_linkList(head,12);
show_linkList(head);
printf("len=%d\n",head->text.len);
printf("-----------------------------\n");
num=deleteHead_linkList(head);
printf("删除的是:%d len=%d\n",num,head->text.len);
num=deleteHead_linkList(head);
printf("删除的是:%d len=%d\n",num,head->text.len);
num=deleteTail_linkList(head);
printf("删除的是:%d len=%d\n",num,head->text.len);
num=deleteTail_linkList(head);
printf("删除的是:%d len=%d\n",num,head->text.len);
show_linkList(head);
printf("----------------------------\n");
insertPos_linkList(head,1,234);
show_linkList(head);
insertPos_linkList(head,10,24);
insertPos_linkList(head,5,23);
show_linkList(head);
printf("---------------------------\n");
deleteBypos_linkList(head,3);
show_linkList(head);
printf("---------------------------\n");
insertSort_linkList(head,23);
insertSort_linkList(head,560);
insertSort_linkList(head,43);
insertSort_linkList(head,12);
show_linkList(head);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "./fun.h"
//创建一个带头结点的空的单链表
linkList* create_linkList()
{
linkList* head=(linkList*)malloc(sizeof(linkList));
if(NULL == head)
{
printf("头结点申请失败,创建单链表失败\n");
return NULL;
}
head->text.len=0; //初始化头结点中链表长度为0
head->next=NULL; //初始化头结点中的指针域为NULL
return head;
}
//判断链表是否为空
int isEmpty_linkList(linkList* head)
{
return head->next == NULL?1:0;
}
//头插法插入数据
int insertHead_linkList(linkList* head,datatype num)
{
//创建一个新的结点
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
return -1;
}
temp->text.data = num;
temp->next = NULL;
//头插法插入数据
temp->next=head->next;
head->next=temp;
head->text.len++;
return 0;
}
//遍历
void show_linkList(linkList* head)
{
linkList* p=head;
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->text.data);
}
printf("\n");
}
//从尾结点插入数据
int insertTail_linkList(linkList* head,datatype num)
{
//创建一个新的结点
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
return -1;
}
//初始化新的结点
temp->next = NULL;
temp->text.data = num;
//尾插法插入数据
//找到链尾表的尾结点
linkList* p=head;
while(p->next!=NULL)
{
p = p->next;
}
p->next=temp;
temp->next=NULL;
//更新头结点中记录的链表长度
head->text.len++;
return 0;
}
//从头结点删除
datatype deleteHead_linkList(linkList* head)
{
if(isEmpty_linkList(head))
{
printf("头删失败,链表为空\n");
return (datatype)-1;
}
//头删法删除
linkList* temp= head->next;
head->next = temp->next;
//宁存要删除的结点中的所有有效数据,然后释放结点
datatype num = temp->text.data;
free(temp);
temp=NULL;
//更新头结点中记录的链表长度
head->text.len--;
return num;
}
//从尾点删除
datatype deleteTail_linkList(linkList* head)
{
if(isEmpty_linkList(head))
{
printf("头删失败,链表为空\n");
return (datatype)-1;
}
linkList* temp= head; //让temp指向头结点
//循环找到倒数第2个结点
while(temp->next->next!=NULL)
{
temp = temp->next;//向后移动一个
}
//上述循环结束后,找到了倒数第2个结点
datatype num=temp->next->text.data;
free(temp->next);
temp->next=NULL;
//更新头结点中记录的链表长度
head->text.len--;
return num;
}
//按位置插入数据
void insertPos_linkList(linkList* head,int pos,datatype num)
{
//判断插入的位置是否合法
if(pos<1 || pos>head->text.len+1)
{
printf("pos=%d 插入位置非法,插入失败\n",pos);
return ;
}
//循环查找要插入位置的前一个节点位置
linkList* p=head;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}//上述循环完毕后,p只想要插入位置的前一个节点
//创建一个新的节点插入到链表中
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
}
temp->text.data=num;
temp->next=NULL;
//插入节点
temp->next=p->next;
p->next=temp;
//更新头结点中记录的链表长度
head->text.len++;
return ;
}
//按照位置删除数据,位置编号从1开始
datatype deleteBypos_linkList(linkList* head,int pos)
{
//判断链表是否为空
if(isEmpty_linkList(head))
{
printf("头删失败,链表为空\n");
return (datatype)-1;
}
//判断和\删除的位置是否合法
if(pos<1 || pos>head->text.len)
{
printf("pos=%d 插入位置非法,插入失败\n",pos);
return(datatype)-1;
}
//循环查找要删除位置的前一个节点位置
linkList* p=head;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}//上述循环完毕后,p只想要删除位置的前一个节点
//修改指向,释放要删除的节点
linkList* temp=p->next; //宁存要删除的结点中的地址
p->next=temp->next;
datatype num=temp->text.data;
free(temp);
temp=NULL;
//更新头结点中记录的链表长度
head->text.len--;
return num;
}
void insertSort_linkList(linkList* head,datatype num)
{
//创建一个新的节点插入到链表中
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
}
temp->text.data=num;
temp->next=NULL;
linkList* p=head; //遍历链表,找到比num大的结点前一个位置
while(p->next !=NULL)
{
if(p->next->text.data>temp->text.data)
{
break;
}
else
{
p=p->next;
}
}
temp->next=p->next;
p->next=temp;
//更新头结点中记录的链表长度
head->text.len++;
}
#ifndef __FUN_H__
#define __FUN_H__
typedef int datatype;
union msg{
datatype data;
int len;
};
typedef struct node{
union msg text;
struct node *next;
}linkList;
linkList* create_linkList();
int insertHead_linkList(linkList* head,datatype num);
void show_linkList(linkList* head);
int insertTail_linkList(linkList* head,datatype num);
datatype deleteHead_linkList(linkList* head);
datatype deleteTail_linkList(linkList* head);
void insertPos_linkList(linkList* head,int pos,datatype num);
datatype deleteBypos_linkList(linkList* head,int pos);
void insertSort_linkList(linkList* head,datatype num);
#endif
a.out:01_main.o 02_linklist.o
gcc 01_main.o 02_linklist.o -o a.out
1main.o:1main.c
gcc 01_main.c -c -o 01_main.o
1.o:1.c
gcc 02_linklist.c -c -o 02_linklist.o