linklist.c //各个功能的函数
#include "linklist.h"
/* 功能: 申请头结点
* 参数: 无
* 返回值: 成功 头结点的首地址
* 失败 NULL
* */
Link *create_linklist() //创建头结点
{
Link *ln = (Link *)malloc(sizeof(Link));
if(NULL == ln)
return NULL;
bzero(ln,sizeof(Link));
return ln;
}
Node *create_linknode(DT va)//创建节点
{
Node *n = (Node *)malloc(sizeof(Node));
if(NULL == n)
return NULL;
bzero(n,sizeof(Node));
n->data = va;
return n;
}
int push_front_linklist(Link *ln,DT va)
{
Node *n = create_linknode(va);
n->next = ln->head;
ln->head = n;
ln->count++;
return 0;
}
int push_back_linklist(Link *ln,DT va)
{
Node *n = create_linknode(va);
if(empty_linklist(ln))
ln->head = n;
else
{
Node *tmp = ln->head;
while(tmp->next) //while(tmp->next!=NULL)
tmp = tmp->next;
tmp->next = n;
}
ln->count++;
return 0;
}
int insert_pos_linklist(Link *ln,int pos,DT va)
{
if(empty_linklist(ln))
return -1;
if(pos<=0 || pos>ln->count+1)
return -2;
if(pos==1)
push_front_linklist(ln,va);
else
{
Node *n = create_linknode(va);
Node *tmp = ln->head;
for(int i=1;i<pos-1;i++)
tmp = tmp->next;
n->next = tmp->next;
tmp->next = n;
ln->count++;
}
return 0;
}
int insert_val_linklist(Link *ln,DT old_va,DT new_va)
{
if(empty_linklist(ln))
return -1;
Node *tmp=ln->head;
while(tmp&&tmp->data!=old_va)
{
tmp=tmp->next;
}
if(tmp)
{
Node *n=create_linknode(new_va);
n->next=tmp->next;
tmp->next=n;
ln->count++;
}
else
return -2;
return 0;
}
int pop_front_linklist(Link *ln)
{
if(empty_linklist(ln))
return -1;
Node *tmp = ln->head;
ln->head = tmp->next;
free(tmp);
ln->count--;
return 0;
}
int pop_back_linklist(Link *ln)
{
if(empty_linklist(ln))
return -1;
else if(ln->count==1)
{
free(ln->head);
ln->head=NULL;
}
else
{
Node *tmp=ln->head;
Node *tmp2=NULL;
while(tmp->next)
{
tmp2=tmp;
tmp = tmp->next;
}
free(tmp);
tmp2->next=NULL;
}
ln->count--;
return 0;
}
int delete_pos_linklist(Link *ln,int pos)
{
if(empty_linklist(ln))
return -1;
if(pos<=0||pos>ln->count)
return -2;
if(pos==1)
pop_front_linklist(ln);
else
{
Node *tmp=ln->head;
Node *pn=tmp->next;
for(int i=1;i<pos-1;i++)
{
tmp=tmp->next;
pn=pn->next;
}
tmp->next=pn->next;
free(pn);
ln->count--;
}
return 0;
}
int delete_val_linklist(Link *ln,DT va)
{
if(empty_linklist(ln))
return -1;
Node *tmp = ln->head;
if(tmp->data == va)
pop_front_linklist(ln);
else
{
Node *t = NULL;
while(tmp!=NULL && tmp->data !=va)
{
t = tmp;
tmp = tmp->next;
}
if(!tmp)
return -2;
t->next = tmp->next;
free(tmp);
ln->count--;
}
return 0;
}
DT *find_pos_linklist(Link *ln,int pos)
{
int i=1;
int j=-1,k=0;
int *p=&j;
int *q=&k;
if(empty_linklist(ln))
return q;
Node *tmp=ln->head;
while(tmp&&pos!=i)
{
tmp=tmp->next;
i++;
}
if(i==pos)
return &tmp->data;
else
return p;
return NULL;
}
int find_val_linklist(Link *ln,DT va)
{
if(empty_linklist(ln))
return -1;
Node *tmp = ln->head;
int pos = 1;//返回位置从1开始
while(tmp && tmp->data!=va)
{
tmp = tmp->next;
pos++;
}
if(tmp)
return pos;
else
return -2;
}
int change_pos_linklist(Link *ln,int pos,DT new_va)
{
int i=1;
Node *tmp=ln->head;
if(empty_linklist(ln))
return -2;
while(tmp&&i<pos)
{
tmp=tmp->next;
i++;
}
if(i==pos)
tmp->data=new_va;
if(tmp==NULL)
return -1;
return 0;
}
int change_val_linklist(Link *ln,DT old_va,DT new_va)
{
if(empty_linklist(ln))
return -1;
Node *tmp = ln->head;
while(tmp && tmp->data!=old_va)
tmp = tmp->next;
if(tmp)
tmp->data = new_va;
else
return -2;
return 0;
}
int display_linklist(Link *ln)
{
Node *tmp = ln->head;
while(tmp) //while(tmp!=NULL)
{
printf("%d ",tmp->data);
tmp = tmp->next;
}
printf("\n");
return 0;
}
/* 功能:判断是否为空
* 参数:头结点首地址
* 返回值:空 1
* 非空 0
* */
int empty_linklist(Link *ln)
{
if(ln->count<=0)
return 1;
else
return 0;
}
int free_linklist(Link *ln)
{
while(!empty_linklist(ln))
pop_front_linklist(ln);
free(ln);
return 0;
}
main.c //主函数
#include "linklist.h"
int main(int argc,const char* argv[])
{
Link *ln = create_linklist();
if(NULL == ln)
return -1;
for(int i=0;i<10;i++)
{
// push_front_linklist(ln,(i+1)*10);
push_back_linklist(ln,(i+1)*10);
}
display_linklist(ln);
// find_pos(ln);
// find_val(ln);
// change_val(ln);
// change_pos(ln);
// insert_pos(ln);
insert_val(ln);
// delete_val(ln);
// delete_pos(ln);
// pop_front(ln);
// pop_back(ln);
free_linklist(ln);
return 0;
}
linklist.c //负责声明函数和创建帧头和帧尾
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int DT; //DT datatype
typedef struct node
{
DT data; //数据域
struct node *next; //指针域
}Node; //节点类型
typedef struct
{
Node *head; //头指针
int count; //计数器
}Link; //头结点
Link *create_linklist(); //创建头结点
Node *create_linknode(DT va);//创建节点
int push_front_linklist(Link *ln,DT va);
int push_back_linklist(Link *ln,DT va);
int insert_pos_linklist(Link *ln,int pos,DT va);
int insert_val_linklist(Link *ln,DT old_va,DT new_va);
int pop_front_linklist(Link *ln);
int pop_back_linklist(Link *ln);
int delete_pos_linklist(Link *ln,int pos);
int delete_val_linklist(Link *ln,DT va);
DT *find_pos_linklist(Link *ln,int pos);
int find_val_linklist(Link *ln,DT va);
int change_pos_linklist(Link *ln,int pos,DT new_va);
int change_val_linklist(Link *ln,DT old_va,DT new_va);
int display_linklist(Link *ln);
int empty_linklist(Link *ln);
int free_linklist(Link *ln);
void insert_val(Link *ln);
void pop_front(Link *ln);
void pop_back(Link *ln);
void delete_pos(Link *ln);
void change_pos(Link *ln);
void find_pos(Link *ln);
void find_val(Link *ln);
void change_val(Link *ln);
void insert_pos(Link *ln);
void delete_val(Link *ln);
#endif
input.c //负责输入输出
#include "linklist.h"
void insert_val(Link *ln)
{
int old_va=0;
int new_va=0;
printf("在哪个数据上插入\n");
scanf("%d",&old_va);
printf("请输入要插入的数值\n");
scanf("%d",&new_va);
int ret=insert_val_linklist(ln,old_va,new_va);
if(ret == -1)
printf("Empty Linklist!\n");
else if(ret == -2)
printf("Not Find!\n");
else
display_linklist(ln);
}
void pop_front(Link *ln)
{
pop_front_linklist(ln);
display_linklist(ln);
}
void pop_back(Link *ln)
{
pop_back_linklist(ln);
display_linklist(ln);
}
void delete_pos(Link *ln)
{
int pos=0;
printf("请输入要删除的位置\n");
scanf("%d",&pos);
int ret=delete_pos_linklist(ln,pos);
if(ret == -1)
printf("Empty Linklist!\n");
else if(ret == -2)
printf("Not Find!\n");
else
display_linklist(ln);
}
void change_pos(Link *ln)
{
int pos=0;
int val=0;
printf("请输入要删除的位置\n");
scanf("%d",&pos);
printf("请输入要改的值\n");
scanf("%d",&val);
int ret=change_pos_linklist(ln,pos,val);
if(ret == -2)
printf("Empty Linklist!\n");
else if(ret == -1)
printf("Not Find!\n");
else
display_linklist(ln);
}
void find_pos(Link *ln)
{
int pos=0;
printf("请输入查找的位置\n");
scanf("%d",&pos);
int ret= *find_pos_linklist(ln,pos);
if(ret == 0)
printf("Empty Linklist!\n");
else if(ret == -1)
printf("Not Find!\n");
else
printf("%d的位置是%d\n",pos,ret);
}
void find_val(Link *ln)
{
DT va = 0;
printf("请输入要查找的值:\n");
scanf("%d",&va);
int ret = find_val_linklist(ln,va);
if(ret == -1)
printf("Empty Linklist!\n");
else if(ret == -2)
printf("Not Find!\n");
else
printf("%d的位置是%d\n",va,ret);
}
void change_val(Link *ln)
{
DT old_va = 0,new_va = 0;
printf("请输入要修改的值和修改后的值:\n");
scanf("%d %d",&old_va,&new_va);
int ret = change_val_linklist(ln,old_va,new_va);
if(ret == -1)
printf("Empty Linklist!\n");
else if(ret == -2)
printf("Not Find!\n");
else
display_linklist(ln);
}
void insert_pos(Link *ln)
{
DT va = 0;
int pos = 0;
printf("请输入要插入的位置和值:\n");
scanf("%d %d",&pos,&va);
int ret = insert_pos_linklist(ln,pos,va);
if(ret == -1)
printf("空链表!\n");
else if(ret == -2)
printf("输入的位置不在范围之内!\n");
else
display_linklist(ln);
}
void delete_val(Link *ln)
{
DT va = 0;
printf("请输入要删除的值:\n");
scanf("%d",&va);
int ret = delete_val_linklist(ln,va);
if(ret == -1)
printf("Empty Linklist!\n");
else if(ret == -2)
printf("Not Find!\n");
else
display_linklist(ln);
}