slist.c
#include "./slist.h"
linklist *link_create()
{
linklist *p = (linklist *)malloc(sizeof(linklist));
if(p == NULL)
{
printf("内存申请失败!\n");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;
}
linklist *node_create(int in_data)
{
linklist *p = (linklist *)malloc(sizeof(linklist));
if(p == NULL)
{
printf("节点内存申请失败!\n");
return NULL;
}
p->data = in_data;
p->next = NULL;
return p;
}
int link_insert(linklist *p,int in_data)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
linklist* temp = node_create(in_data);
if(temp == NULL)
{
printf("节点申请失败!\n");
return -2;
}
temp->next = p->next;
p->next = temp;
p->len++;
return 0;
}
int link_tail(linklist *p,int in_data)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
linklist *h = p;
linklist *temp = node_create(in_data);
if(temp == NULL)
{
printf("节点申请失败!\n");
return -2;
}
p->len++;
while(p->next != NULL)
{
p = p->next;
}
temp->next = p->next;
p->next = temp;
return 0;
}
int link_print(linklist *p)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
while(p->next != NULL)
{
p = p->next;
printf("%d\t",p->data);
}
printf("\n");
}
int link_empty(linklist *p)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
if(p->next == NULL)
{
printf("链表为空\n");
return 1;
}
return 0;
}
int del_head(linklist *p)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
p->len--;
linklist *temp = p->next;
p->next = temp->next;
free(temp);
temp = NULL;
}
int del_tail(linklist *p)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
p->len--;
while(p->next->next != NULL)
{
p=p->next;
}
linklist *temp = p->next;
p->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
linklist *search_pos(linklist *p,int pos)
{
if(p == NULL)
{
printf("入参为空!\n");
return NULL;
}
if(pos < 1 || pos > p->len)
{
printf("位置不合理!\n");
return -2;
}
while(pos--)
{
p=p->next;
}
return p;
}
int search_data(linklist *p,int in_data)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
int i = 0;
while(p != NULL && p->data != in_data)
{
p = p->next;
i++;
}
if(p != NULL)
{
return i;
}
}
int updata_pos(linklist *p,int pos,int in_data)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
if(pos < 1 || pos > p->len+1)
{
printf("位置不合理!\n");
return -2;
}
linklist *temp = search_pos(p,pos);
temp->data = in_data;
return 0;
}
int updata_data(linklist *p,int data,int in_data)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
int pos = search_data(p,data);
updata_pos(p,pos,in_data);
return 0;
}
int del(linklist *p,int pos)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
if(pos < 1 || pos > p->len)
{
printf("位置不合理!\n");
return -2;
}
p->len--;
while(--pos)
{
p = p->next;
}
linklist *temp = p->next;
p->next = p->next->next;
free(temp);
temp = NULL;
return 0;
}
int merge_link(linklist *p,linklist *q)
{
if(p == NULL || q == NULL)
{
printf("入参为空!\n");
return -1;
}
while(p->next != NULL)
{
p = p->next;
}
linklist *temp = q;
p->next = q->next;
free(q);
q = NULL;
return 0;
}
int delete_(linklist **p)
{
if(*p == NULL)
{
printf("入参为空!\n");
return -1;
}
linklist *temp;
while((*p)->next!=NULL)
{
temp = (*p);
(*p) = (*p)->next;
free(temp);
temp = NULL;
}
free(*p);
*p = NULL;
return 0;
}
int reverse(linklist *p)
{
if(p == NULL)
{
printf("入参为空!\n");
return -1;
}
linklist *cur,*temp;
cur = temp = p->next;
p->next = NULL;
while(cur != NULL)
{
temp = cur;
cur = cur->next;
temp->next = p->next;
p->next = temp;
}
return 0;
}
slist.h
#ifndef __SLIST_H__
#define __SLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
union
{
int len;
int data;
};
struct node *next;
}linklist;
linklist *link_create();
linklist *node_create();
int link_insert(linklist *p,int in_data);
int link_tail(linklist *p,int in_data);
int link_print(linklist *p);
int link_empty(linklist *p);
int del_head(linklist *p);
int del_tail(linklist *p);
linklist *search_pos(linklist *p,int pos);
int search_data(linklist *p,int in_data);
int updata_pos(linklist *p,int pos,int in_data);
int updata_data(linklist *p,int data,int in_data);
int del(linklist *p,int pos);
int merge_link(linklist *p,linklist *q);
int delete_(linklist **p);
int reverse(linklist *p);
#endif
main.c
#include "./slist.h"
int main(int argc, const char *argv[])
{
linklist *p = link_create();
linklist *q = link_create();
link_insert(p,40);
link_insert(p,30);
link_insert(p,20);
link_insert(p,10);
reverse(p);
link_print(p);
return 0;
}