all: main
main: main.o list.o
$(CC) $^ -o $@
clean:
rm *.o main -rf
2.list.c
#include"list.h"#include<stdio.h>#include<stdlib.h>
list*list_create(){
list * me;
me =(list*)malloc(sizeof(list));if(me ==NULL)returnNULL;
me->next =NULL;//不需要对me->data操作return me;}//第一个有效节点规定为第0个节点,有头节点所以不用传二级指针intlist_insert_at(list* me,int i, datatype *data){if(i <0)return-1;
list *p = me;int j =0;while(j < i && p !=NULL){
p = p->next;
j++;}if(p){
list *newnode;
newnode =(list*)malloc(sizeof(list));if(newnode ==NULL)return-2;
newnode->data =*data;
newnode->next = p->next;
p->next = newnode;return0;}else{return-3;}}intlist_delete_at(list *me,int i, datatype *data){if(i <0)return-1;int j =0;
list *p = me;
list *q;while(p && j < i -1)//data从0开始{
j++;
p = p->next;}if(p){
q = p->next;
p->next = q->next;free(q);
q=NULL;return0;}else{return-2;}/*
while(p->next && j < i - 1) //i不对,原因?
{
j++;
p = p->next;
}
if(p->next == NULL)
{
return -1;
}
else
{
q = p->next;
p->next = q->next;
free(q);
q= NULL;
return 0;
}
*/}intlist_order_insert(list *me, datatype *data){//p作为me的副本进行移动,q用于记住要插入节点的前驱
list *p = me;
list *q =NULL;/*
if(me->next == NULL)
{
q = (list*)malloc(sizeof(list));
p->next = q;
q->data = data;
q->next = NULL;
}
*/while(p->next &&(p->next->data)<*data)//p->next{
p = p->next;}
q =(list*)malloc(sizeof(list));if(NULL== q)return-1;
q->next = p->next;
p->next = q;
q->data =*data;return0;}intlist_delete(list *me, datatype *data){
list *p = me,*q;while(p->next && p->next->data !=*data)//p->next{
p = p->next;}if(p->next ==NULL)return-1;else{
q = p->next;
p->next = p->next->next;free(q);
q =NULL;}}intlist_isempty(list *me){if(me->next ==NULL)return0;elsereturn1;}voidlist_display(list *me){
list* node = me;//node要不要分配空间?//node->next = me->next;if(list_isempty(me)!=0){while(node->next !=NULL){
node = node->next;printf("%d ", node->data);}printf("\n");}return;}//感觉并没有free掉voidlist_destroy(list *me){
list* node,*next;for(node = me->next; node !=NULL; node = node->next)//node = next;{
next = node->next;free(node);}free(me);return;}
3.list.h
#ifndefLIST_H__#defineLIST_H__typedefint datatype;typedefstructnode_st{
datatype data;structnode_st*next;}list;
list*list_create();intlist_insert_at(list*,int i, datatype*);intlist_delete_at(list*,int i, datatype*);intlist_order_insert(list*, datatype*);intlist_delete(list*, datatype*);intlist_isempty(list*);voidlist_destroy(list*);#endif
4.main.c
#include"list.h"#include<stdio.h>#include<stdlib.h>intmain(){
list *l;int num =34;int i;int arr[]={12,9,23,2,34,6,45};
l =list_create();for(i =0; i <(sizeof(arr)/sizeof(int)); i++){if(list_order_insert(l,&arr[i]))exit(1);}list_display(l);list_delete_at(l,5,&num);list_display(l);list_destroy(l);exit(0);}