链表的头尾操作及按位置操作
一、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.outCC:=gcc
CAN:=-c -o
六、运行结果
