mnbmb
#include"doublelinklist.h"
int main(int argc,const char *argv[])
{
int n=0;
datatype e;
int flag=0;
int pos=0;
//创建头结点
Doublelinklist L=creat_head();
#if 0
printf("头插\n");
//头插
printf("请输入要插入元素的个数:");
scanf("%d",&n);
for(int i=0;i
printf("请输入要插入的字符元素:");
scanf(" %c",&e);
insert_head(L,e);
}
//双向遍历双链表
Output(L);
#else
//尾插
printf("尾插:\n");
printf("请输入要插入元素的个数:");
scanf("%d",&n);
for(int i=0;i
printf("请输入要插入的字符元素:");
scanf(" %c",&e);
insert_rear(L,e);
}
Output(L);
#endif
/*
//头删
printf("头删结果:\n");
flag=delete_head(L);
if(flag==-1)
printf("头删失败\n");
else
Output(L);
//尾删
printf("尾删结果:\n");
flag=delete_rear(L);
if(flag==-1)
printf("尾删失败\n");
else
Output(L);
//按位置插入
printf("请输入要插入的位置:");
scanf("%d",&pos);
printf("请输入要插入的字符元素:");
scanf(" %c",&e);
flag=insert_by_pos(L,pos,e);
printf("按位置插入结果:\n");
if(flag==-1)
printf("按位置插入失败\n");
else
Output(L);
//按位置删除
printf("请输入要删除的位置:");
scanf("%d",&pos);
flag=delete_by_pos(L,pos);
printf("按位置删除的结果\n");
if(flag==-1)
printf("按位置删除失败\n");
else
Output(L);
*/
//按位置修改
printf("请输入要修改的位置:");
scanf("%d",&pos);
printf("请输入要修改的字符元素:");
scanf(" %c",&e);
flag=updata_by_pos(L,pos,e);
printf("按位置修改结果:\n");
if(flag==-1)
printf("按位置修改失败\n");
else
Output(L);
//按位置查找
printf("请输入要查找的位置:");
scanf("%d",&pos);
printf("按位置查找结果:\n");
search_by_pos(L,pos);
//释放空间
L=free_Doublelinklist(L);
return 0;
}
doublelinklist.c
#include"doublelinklist.h"
/*
*function : 创建头结点
*@param [in]: 无参数
*@param [out]:
*@return : 成功返回头结点的首地址,失败返回NULL
*/
Doublelinklist creat_head(){
Doublelinklist L=(Doublelinklist)malloc(sizeof(struct Node));
if(L==NULL)
return NULL;
return L;
}
/*
*function : 创建结点
*@param [in]: 无参数
*@param [out]:
*@return : 成功返回结点首地址,失败返回NULL
*/
Doublelinklist creat_code(){
Doublelinklist p=(Doublelinklist)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
return p;
}
/*
*function : 头插
*@param [in]: 双链表,插入的元素
*@param [out]:
*@return : 成功返回0;失败返回-1
*/
int insert_head(Doublelinklist L,datatype e){
//判断头结点是否存在
if(L==NULL)
return -1;
//创建新结点p
Doublelinklist p=creat_code();
if(p==NULL)
return -1;
//p的数据域赋值
p->data=e;
//在头结点后插入p
p->next=L->next;
p->prev=L;
if(L->next!=NULL)//判断头结点后面是否有结点
L->next->prev=p;
L->next=p;
L->len++;
return 0;
}
/*
*function : 双向遍历双链表
*@param [in]: 双链表
*@param [out]:
*@return :
*/
void Output(Doublelinklist L){
//判断头结点是否存在,链表长度是否为0
if(L==NULL||L->len==0)
return;
Doublelinklist p=L;
#if 0
for(int i=0;i
p=p->next;
printf("%c\t",p->data);
}
printf("\n");
for(int i=0;i
p=p->prev;
printf("%c\t",p->data);
}
printf("\n");
#else
printf("正向:\n");
while(p->next){
p=p->next;
printf("%c\t",p->data);
}
printf("\n");
printf("逆向:\n");
while(p->prev){
printf("%c\t",p->data);
p=p->prev;
}
printf("\n");
#endif
}
/*
*function : 尾插
*@param [in]: 双链表,要插入的元素
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int insert_rear(Doublelinklist L,datatype e){
if(L==NULL)
return -1;
Doublelinklist p=L;
//让p到达最后一个结点
while(p->next){
p=p->next;
}
//创建新结点
Doublelinklist s=creat_code();
//s的数据域赋值
s->data=e;
//s的指针域
s->prev=p;
s->next=p->next;
p->next=s;
L->len++;
return 0;
}
/*
*function : 头删
*@param [in]: 双链表
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int delete_head(Doublelinklist L){
if(L==NULL||L->len==0)
return -1;
Doublelinklist p=L->next;
L->next=p->next;
if(p->next!=NULL)
p->next->prev=L;
free(p);
p=NULL;
L->len--;
return 0;
}
/*
*function : 尾删
*@param [in]: 双链表
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int delete_rear(Doublelinklist L){
if(L==NULL || L->len==0)
return -1;
Doublelinklist p=L;
while(p->next){
p=p->next;
}
p->prev->next=NULL;
free(p);
p=NULL;
L->len--;
return 0;
}
/*
*function : 按位置插入
*@param [in]: 双链表,位置,插入的值
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int insert_by_pos(Doublelinklist L,int pos,datatype e){
//判断头结点是否存在,位置是否合法
if(L==NULL||pos<1||pos>(L->len)+1)
return -1;
//找到pos-1
Doublelinklist p=L;
for(int i=0;i
p=p->next;
}
//创建新结点
Doublelinklist s=creat_code();
//数据域赋值
s->data=e;
//指针域
s->next=p->next;
s->prev=p;
if(p->next!=NULL)
p->next->prev=s;
p->next=s;
L->len++;
return 0;
}
/*
*function : 按位置删除
*@param [in]: 双链表,位置
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int delete_by_pos(Doublelinklist L,int pos){
//判断头结点是否存在,链表长度是否为0,位置是否合法
if(L==NULL||L->len==0||pos<1||pos>L->len)
return -1;
//找到pos
Doublelinklist p=L;
for(int i=0;i
p=p->next;
}
p->prev->next=p->next;
if(p->next!=NULL)
p->next->prev=p->prev;
L->len--;
return 0;
}
/*
*function : 按位置修改
*@param [in]: 双链表,位置,修改的值
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int updata_by_pos(Doublelinklist L,int pos,datatype e){
if(L==NULL||L->len==0||pos<1||pos>L->len)
return -1;
Doublelinklist p=L;
for(int i=0;i
p=p->next;
}
p->data=e;
return 0;
}
/*
*function : 按位置查找
*@param [in]: 双链表,位置
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int search_by_pos(Doublelinklist L,int pos){
if(L==NULL||L->len==0||pos<1||pos>L->len)
return -1;
Doublelinklist p=L;
for(int i=0;i
p=p->next;
}
printf("该位置的值为:%c\n",p->data);
return 0;
}
/*
*function : 释放空间
*@param [in]: 双向链表
*@param [out]:
*@return : 返回NULL
*/
Doublelinklist free_Doublelinklist(Doublelinklist L){
if(L==NULL)
return NULL;
Doublelinklist p=L->next;
while(p->next){
delete_rear(L);
}
free(L);
L=NULL;
return L;
}
单向循环链表操作:
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include
#include
#include
typedef float datatype;
typedef struct Node{
//数据域
union{
int len;
datatype data;
};
//指针域
struct Node *next;
}*LoopLink;
LoopLink creat_head();
LoopLink creat_node();
int insert_head(LoopLink L,datatype e);
void Output(LoopLink L);
int insert_rear(LoopLink L,datatype e);
int delete_head(LoopLink L);
int delete_rear(LoopLink L);
#endif
main.c
#include"head.h"
int main(int argc,const char *argv[])
{
int n;
datatype e;
int flag=0;
//创建头结点
LoopLink L=creat_head();
#if 0
//头插
printf("头插:\n");
printf("请输入要输入元素的个数:");
scanf("%d",&n);
for(int i=0;i
printf("请输入元素(小数):");
scanf("%f",&e);
insert_head(L,e);
}
//遍历
Output(L);
#else
//尾插
printf("尾插:\n");
printf("请输入要输入元素的个数:");
scanf("%d",&n);
for(int i=0;i
printf("请输入元素(小数):");
scanf("%f",&e);
insert_rear(L,e);
}
Output(L);
#endif
//头删
printf("头删:\n");
flag=delete_head(L);
if(flag==-1)
printf("头删失败\n");
else
Output(L);
//尾删
printf("尾删:\n");
flag=delete_rear(L);
if(flag==-1)
printf("尾删失败\n");
else
Output(L);
return 0;
}
#include"head.h"
/*
*function : 创建头结点
*@param [in]: 无参数
*@param [out]:
*@return : 成功返回头结点首地址,失败返回NULL
*/
LoopLink creat_head(){
LoopLink L=(LoopLink)malloc(sizeof(struct Node));
if(L==NULL)
return NULL;
L->len=0;
L->next=L;
return L;
}
/*
*function : 创建新结点
*@param [in]: 无参数
*@param [out]:
*@return : 成功返回结点首地址,失败返回NULL
*/
LoopLink creat_node(){
LoopLink p=(LoopLink)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
/*
*function : 头插
*@param [in]: 循环单链表,插入的值
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int insert_head(LoopLink L,datatype e){
//判断头结点是否存在
if(L==NULL)
return -1;
//创建新结点
LoopLink p=creat_node();
//判断新结点是否创建成功
if(p==NULL)
return -1;
//p的数据域赋值
p->data=e;
//p的指针域
p->next=L->next;
L->next=p;
L->len++;
return 0;
}
/*
*function : 遍历循环单链表
*@param [in]: 循环单链表
*@param [out]:
*@return : 无返回值
*/
void Output(LoopLink L){
//判断头结点是否存在,链表长度是否为0
if(L==NULL||L->len==0)
return ;
LoopLink p=L;
for(int i=0;i
p=p->next;
printf("%.2f\t",p->data);
}
printf("\n");
}
/*
*function : 尾插
*@param [in]: 循环单链表,要插入的元素
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int insert_rear(LoopLink L,datatype e){
//判断头结点是否存在
if(L==NULL)
return -1;
//找到最后一个结点
LoopLink p=L;
while(p->next!=L){
p=p->next;
}
//创建新结点
LoopLink s=creat_node();
if(s==NULL)
return -1;
//s的数据域赋值
s->data=e;
//指针域
s->next=p->next;
p->next=s;
L->len++;
return 0;
}
/*
*function : 头删
*@param [in]: 循环单链表
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int delete_head(LoopLink L){
//判断头结点是否存在,链表长度是否为0
if(L==NULL||L->len==0)
return -1;
LoopLink p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
/*
*function : 尾删
*@param [in]: 循环单链表
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int delete_rear(LoopLink L){
//判断头结点是否存在,链表长度是否为0
if(L==NULL||L->len==0)
return -1;
//找到最后一个结点的前一个结点
LoopLink p=L;
for(int i=0;i
p=p->next;
}
LoopLink s=p->next;
p->next=s->next;
free(s);
s=NULL;
L->len--;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
