链表的头尾操作及按位置操作
一、main函数
#include <stdio.h>
#include <stdlib.h>
#include "./3.linklist.h"
int main(int argc, const char *argv[])
{
linkList* head = create_linkList();
//头插法插入数据
insertHead_linklist(head,10);
insertHead_linklist(head,20);
insertHead_linklist(head,30);
insertHead_linklist(head,40);
insertHead_linklist(head,50);
show_linklist(head); // 遍历链表
//尾插法插入数据
insertEnd_linklinst(head,99);
insertEnd_linklinst(head,88);
insertEnd_linklinst(head,77);
insertEnd_linklinst(head,66);
show_linklist(head);
delHead_linklist(head); //头删法删除数据
show_linklist(head);
delEnd_linklist(head); //尾删法删除数据
show_linklist(head);
insertByindex_linklist(head,2,10086); //按位置插入数据
show_linklist(head);
delByindex_linklist(head,6); //按位置删除数据
show_linklist(head);
selectByindex_linklist(head,5); //按位置查找数据
freelink(head); //释放链表
return 0;
}
二、功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./3.linklist.h"
//创建链表
linkList*create_linkList(void)
{
linkList* head = (linkList*)malloc(sizeof(linkList));
if(NULL == head)
{
printf("头结点申请失败,创建单链表失败\n");
return NULL ;
}
head->text.len =0;
head->next = NULL ;
return head;
}
//释放链表
void freelink(linkList*temp)
{
free(temp);
return;
}
void insertHead_linklist(linkList*head,dataType num) //头插法插入数据
{
linkList*temp = (linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
return ;
}
temp->text.data= num;
temp->next = NULL ;
temp->next=head->next;
head->next=temp;
head->text.len++; //更新链表长度
return ;
}
void show_linklist(linkList*head) //遍历链表
{
linkList*p=head;
while(p->next != NULL)
{
p=p->next;
printf("%d ",p->text.data);
}
printf("\n");
return ;
}
void insertEnd_linklinst(linkList*head,dataType num) //尾插法插入数据
{
linkList* p =head;
while(p->next != NULL )
{
p=p->next;
}
linkList*temp = (linkList*)malloc(sizeof(linkList));
if( NULL == temp)
{
printf("结点申请失败,尾插失败\n");
return ;
}
temp->text.data = num;
temp->next = NULL ;
p->next=temp;
head->text.len++;
return ;
}
int isEmpty_linklist(linkList*head)
{
return head->next == NULL?1:0;
}
//头删法删除数据
void delHead_linklist(linkList*head)
{
if(isEmpty_linklist(head))
{
printf("链表为空,头删失败\n");
return ;
}
linkList*temp=head->next;
head->next=head->next->next ;
head->text.len--;
freelink(temp);
return ;
}
//尾删法删除数据
void delEnd_linklist(linkList*head)
{
if(isEmpty_linklist(head))
{
printf("链表为空,尾删失败\n");
return ;
}
linkList*p=head;
while(NULL != p->next->next)
{
p=p->next;
}
linkList*temp=p->next;
p->next=NULL;
head->text.len--;
freelink(temp);
return ;
}
//按位置插入数据
void insertByindex_linklist(linkList*head,int index,dataType num)
{
if(index<1 || index>head->text.len+1)
{
printf("位置非法,插入失败\n");
return ;
}
int i=1;
linkList*p=head;
for(i;i<index;i++)
{
p=p->next;
}
linkList*temp = (linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,插入失败\n");
return ;
}
temp->text.data=num;
temp->next=p->next;
p->next = temp;
head->text.len++;
return ;
/按位置删除数据
oid delByindex_linklist(linkList*head,int index)
if(index<1 || index>head->text.len+1)
{
printf("位置非法,删除失败\n");
return ;
}
if(isEmpty_linklist(head))
{
printf("链表为空,无法进行删除\n");
return ;
}
int i=1;
linkList*p=head;
for(i;i<index;i++)
{
p=p->next;
}
linkList*temp=p->next;
p->next=p->next->next;
freelink(temp);
head->text.len--;
return;
}
//按位置查找数据
void selectByindex_linklist(linkList*head,int index)
{
if(index>head->text.len)
{
printf("位置非法,无法查询\n");
return ;
}
int i=1;
linkList*p=head;
for(i;i<=index;i++)
{
p=p->next;
}
printf("%d\n",p->text.data);
return ;
}
//直接插入排序
void insertSort_linklist(linkList*head,dataType num)
{
linkList*temp = (linkList*)malloc(sizeof(linkList));
if( NULL == temp)
{
printf("结点申请失败,插入失败\n");
return ;
}
temp->text.data = num;
temp->next=NULL;
linkList* p= head;
while(p->next != NULL)
{
if(temp->text.data <= p->text.data)
{
break;
}
else
{
p=p->next;
}
}
temp->next=p->next;
p->next=temp->next;
head->text.len++;
return;
}
三、头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef int dataType;
union msg{
dataType data;
int len;
};
typedef struct node{
union msg text;
struct node* next;
}linkList;
linkList*create_linkList(void);
void freelink(linkList*head);
void insertHead_linklist(linkList*head,dataType num);
void insertEnd_linklinst(linkList*head,dataType num);
void show_linklist(linkList*head);
void delHead_linklist(linkList*head);
void delEnd_linklist(linkList*head);
void insertByindex_linklist(linkList*head,int index,dataType num);
void delByindex_linklist(linkList*head,int index);
void selectByindex_linklist(linkList*head,int index);
void insertSort_linklist(linkList*head,dataType num);
#endif
四、makefile文件
-include ./Makefile.cfg
$(Target):$(Obj)
@$(CC) $^ -o $@
%.o:%.c
@$(CC) $^ $(CAN) $@
clean:
@rm $(Obj) $(Target)
五、Makefile.cfg文件
Obj:= 1.main.o 2.linklist.o
Target:=a.out
CC:=gcc
CAN:=-c -o