#ifndef _SINGLE_LIST__H
#define _SINGLE_LIST__H
#include "stdio.h"
#include "stdlib.h"
typedef int datatype;
typedef struct slist{
datatype dat;
struct slist* next;
}s_node;
s_node* slist_create(void);
int slist_insert_at(s_node* list,int i,datatype* dat);
int slist_delete_at(s_node* list,int i,datatype* dat);
int slist_insert_order(s_node* list,datatype* dat);
int slist_insert_tail(s_node* list,datatype* dat);
int slist_insert_first(s_node* list,datatype* dat);
int slist_delete_tail(s_node* list,datatype* out_dat);
int slist_delete_first(s_node* list,datatype*out_dat);
int slist_delete(s_node* list,datatype* dat);
int slist_find(s_node* list,datatype* dat);
int slist_isempty(s_node* list);
void slist_show(s_node* list);
void slist_destroy(s_node* list);
#endif
#include "single_list.h"
s_node* slist_create(void)
{
s_node* plist = NULL;
plist = malloc(sizeof(s_node));
if(plist == NULL)
return NULL;
plist->next = NULL;
return plist;
}
int slist_insert_at(s_node* list,int i,datatype* dat)
{
if(i<0) return -1;
s_node* p = list;
int j=0;
while(p!= NULL && j<i)
{
p=p->next;
j++;
}
if(p==NULL) return -2;
else
{
s_node* insert_node = slist_create();
if(insert_node == NULL) return -3;
insert_node->dat = *dat;
insert_node->next = p->next;
p->next = insert_node;
}
return 0;
}
int slist_delete_at(s_node* list,int i,datatype* out_dat)
{
if(i<0) return -1;
s_node*p = list;
int j=0;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
if(p==NULL) return -2;
else
{
s_node* del_node;
del_node = p->next;
if(out_dat!= NULL) *out_dat = del_node->dat;
p->next = del_node->next;
free(del_node);del_node=NULL;
}
return 0;
}
int slist_insert_order(s_node* list,datatype* dat)
{
s_node * p=list;
s_node* insert_node;
while(p->next!=NULL)
{
if(p->next->dat > *dat)break;
p=p->next;
}
insert_node = slist_create();
if(insert_node == NULL) return -1;
insert_node->dat = *dat;
insert_node->next = p->next;
p->next = insert_node;
return 0;
}
int slist_insert_tail(s_node* list,datatype* dat)
{
s_node *p=list;
s_node *insert_node;
while(p->next != NULL)
{
p=p->next;
}
insert_node = slist_create();
if(insert_node == NULL) return -1;
insert_node->dat = *dat;
insert_node->next=p->next;
p->next=insert_node;
return 0;
}
int slist_insert_first(s_node* list,datatype* dat)
{
s_node *p=list;
s_node *insert_node;
insert_node = slist_create();
if(insert_node == NULL) return -1;
insert_node->dat = *dat;
insert_node->next=p->next;
p->next=insert_node;
}
int slist_delete_tail(s_node* list,datatype* out_dat)
{
s_node *p=list;
s_node *p_prev;
if(slist_isempty(p)==1) return -1;
p_prev=p;
while(p->next != NULL)
{
p_prev=p;
p=p->next;
}
if(out_dat!=NULL) *out_dat = p->dat;
free(p);
p_prev->next=NULL;
return 0;
}
int slist_delete_first(s_node* list,datatype*out_dat)
{
s_node*p=list;
s_node *p_next;
if(slist_isempty(p)==1) return -1;
p_next = p->next->next;
if(out_dat!=NULL) *out_dat = p->next->dat;
free(p->next);
p->next = p_next;
return 0;
}
int slist_delete(s_node* list,datatype* dat)
{
if(dat == NULL) return -1;
s_node*p=list;
s_node*p_next;
while(p->next !=NULL)
{
if(p->next->dat == *dat) break;
p=p->next;
}
if(p->next == NULL) return -2;
p_next=p->next;
p->next=p_next->next;
free(p_next);
return 0;
}
int slist_find(s_node* list,datatype* dat)
{
if(dat == NULL) return -1;
int num=0;
s_node*p=list;
s_node*p_next;
while(p->next !=NULL)
{
if(p->next->dat == *dat) break;
num++;
p=p->next;
}
if(p->next == NULL) return -2;
return num;
}
int slist_isempty(s_node* list)
{
if(list->next==NULL)return 1;
return 0;
}
void slist_show(s_node* list)
{
if(slist_isempty(list)==1) return;
s_node* p = list->next;
for(;p!=NULL;p=p->next)
{
printf("%d ",p->dat);
}
printf("\n");
}
void slist_destroy(s_node* list)
{
s_node * p;
s_node * p_next;
for(p=list->next;p!=NULL;p=p_next)
{
p_next=p->next;
free(p);p=NULL;
}
free(list);list=NULL;
}
#include "single_list.h"
datatype arr[10]={12,34,56,23,56,1,34,24,90,76};
datatype arr1[10]={24,34,6,23,6,1,100,51,90,0};
int main(int argc ,char*argv[])
{
printf("特定位置插入、删除\r\n");
s_node* L= slist_create();
if(L==NULL) goto exit;
int i,ret;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if((ret = slist_insert_at(L,i,&arr[i]))!=0)
{
printf("err:%d\n",ret);
goto exit;
}
}
slist_show(L);
datatype dat;
slist_delete_at(L,0,&dat);
printf("del: %d\n",dat);
slist_delete_at(L,3,&dat);
printf("del: %d\n",dat);
slist_delete_at(L,7,&dat);
printf("del: %d\n",dat);
slist_show(L);
slist_destroy(L);
printf("\r\n");
printf("按顺序插入\r\n");
s_node* L1= slist_create();
if(L1==NULL) goto exit;
for(i=0;i<(sizeof(arr1)/sizeof(arr1[0]));i++)
{
if((ret = slist_insert_order(L1,&arr1[i]))!=0)
{
printf("err:%d\n",ret);
goto exit;
}
}
slist_show(L1);
printf("\r\n");
dat = 15;
printf("尾部插入 %d \r\n",dat);
slist_insert_tail(L1,&dat);
slist_show(L1);
printf("\r\n");
dat = 33;
printf("首部插入 %d \r\n",dat);
slist_insert_first(L1,&dat);
slist_show(L1);
printf("\r\n");
slist_delete_tail(L1,&dat);
printf("尾部删除 %d \r\n",dat);
slist_show(L1);
printf("\r\n");
slist_delete_first(L1,&dat);
printf("首部删除 %d \r\n",dat);
slist_show(L1);
printf("\r\n");
dat = 0;
printf("删除%d \r\n",dat);
slist_delete(L1,&dat);
slist_show(L1);
printf("\r\n");
dat = 6;
printf("删除%d \r\n",dat);
slist_delete(L1,&dat);
slist_show(L1);
printf("\r\n");
dat = 100;
printf("删除%d \r\n",dat);
slist_delete(L1,&dat);
slist_show(L1);
printf("\r\n");
dat = 200;
printf("删除%d \r\n",dat);
slist_delete(L1,&dat);
slist_show(L1);
printf("\r\n");
int num;
dat = 200;num=-1;
if((num = slist_find(L1,&dat))>=0)
printf("发现%d节点编号%d\r\n",dat,num);
else
printf("%d节点不在链表中\r\n",dat);
slist_show(L1);
printf("\r\n");
dat = 1;num=-1;
if((num = slist_find(L1,&dat))>=0)
printf("发现%d节点编号%d\r\n",dat,num);
else
printf("%d节点不在链表中\r\n",dat);
slist_show(L1);
printf("\r\n");
dat = 6;num=-1;
if((num = slist_find(L1,&dat))>=0)
printf("发现%d节点编号%d\r\n",dat,num);
else
printf("%d节点不在链表中\r\n",dat);
slist_show(L1);
printf("\r\n");
dat = 90;num=-1;
if((num = slist_find(L1,&dat))>=0)
printf("发现%d节点编号%d\r\n",dat,num);
else
printf("%d节点不在链表中\r\n",dat);
slist_show(L1);
printf("\r\n");
slist_destroy(L1);
exit:
return 0;
}

