C语言实现双向链表的增删改查等操作
head.h
/*
---------------------------------
@author:YoungZorn
created on 2023/5/18 13:53.
---------------------------------
*/
#ifndef LINKLIST_BIDIRECTIONAL_H
#define LINKLIST_BIDIRECTIONAL_H
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef char datatype;
typedef struct Node{
union {
int len;
datatype data;
};
struct Node *next;
struct Node *prev;
}*double_linklist;
double_linklist create(int flag);//创建头节点
int insertOnHead(double_linklist L,datatype e); //头插
void output(double_linklist L); //循环遍历
int insertOnRear(double_linklist L,datatype e); //尾插
int deleteOnHead(double_linklist L); //头删
int deleteOnRear(double_linklist L); //尾删
int insertByPos(double_linklist L,int index,datatype e);//按位置插入
int deleteByPos(double_linklist L,int index); //按位置删除
int updateByPos(double_linklist L,int index,datatype e);//按位置修改
int searchByPos(double_linklist L,int index);//按位置查找
#endif //LINKLIST_BIDIRECTIONAL_HEAD_H
func.c
/*
---------------------------------
@author:YoungZorn
created on 2023/5/18 13:53.
---------------------------------
*/
#include "head.h"
double_linklist create(int flag){
double_linklist L = (double_linklist) malloc(sizeof(struct Node));
if (L == NULL){
return NULL;
}
L->next = NULL;
L->prev = NULL;
if (flag = 1) {
L->len = 0;
} else{
L->data = ' ';
}
return L;
}
int insertOnHead(double_linklist L,datatype e){
if (L == NULL){
return -1;
}
double_linklist p = L;
double_linklist s = create(0);
if (s == NULL){
return -1;
}
s->data = e;
s->prev = p;
s->next = p->next;
if (L->next != NULL){
s->next->prev = p;
}
p->next = s;
L->len++;
return 0;
}
void output(double_linklist L){
if (L == NULL || L->next ==NULL){
printf("EMPTY LIST\n");
return;
}
puts("Forward output:");
double_linklist p = L;
while (p->next != NULL){
p = p->next;
printf("%c\t",p->data);
}
/*puts(" ");
puts("Reverse output:");
while (p->prev != NULL){
printf("%c\t",p->data);
p = p->prev;
}*/
puts(" ");
}
int insertOnRear(double_linklist L,datatype e){ //尾插
if (L == NULL){
return -1;
}
double_linklist p = L;
while (p->next != NULL){
p = p->next; //p走到最后一个节点所在位置
}
double_linklist s = create(0);
s->data = e;
p->next = s;
s->prev = p;
L->len++;
return 0;
}
int deleteOnHead(double_linklist L){ //头删
if (L == NULL || L->next== NULL){
printf("EMPTY LIST\n");
return -1;
}
double_linklist q = L->next;
L->next = q->next;
if (q->next!=NULL){
q->next->prev = L;
}
free(q);
q = NULL;
L->len--;
}
int deleteOnRear(double_linklist L){ //尾删
if (L == NULL || L->next== NULL){
printf("EMPTY LIST\n");
return -1;
}
double_linklist p = L;
while (p->next !=NULL){
p = p->next;
}
p->prev->next = NULL;
free(p);
p = NULL;
L->len--;
return 0;
}
int insertByPos(double_linklist L,int index,datatype e){
if (L == NULL || index<0 || index>=L->len){
printf("INSERT ERROR\n");
return -1;
}
double_linklist p = L;
double_linklist s = create(0);
s->data = e;
int count = 0;
while (p->next != NULL){
if (count == index){
insertOnHead(p,e);
break;
}
p = p->next;
count++;
}
return 0;
}
int deleteByPos(double_linklist L,int index){ //按位置删除
if (L == NULL || index<0 || index>=L->len){
printf("DELETE ERROR\n");
return -1;
}
double_linklist p = L;
int count = 0;
while (p->next != NULL){
if (count == index){
deleteOnHead(L);
break;
}
p = p->next;
count++;
}
return 0;
}
int updateByPos(double_linklist L,int index,datatype e){ //按位置修改
if (L == NULL || index<0 || index>=L->len){
printf("UPDATE ERROR\n");
return -1;
}
double_linklist p = L;
double_linklist s = create(0);
s->data = e;
int count = 0;
while (p->next != NULL){
if (count == index){
p->next->data = s->data;
break;
}
p = p->next;
count++;
}
return 0;
}
int searchByPos(double_linklist L,int index){ //按位置查找
if (L == NULL || index<0 || index>=L->len){
printf("SEARCH ERROR\n");
return -1;
}
double_linklist p = L;
int count = 0;
while (p->next != NULL){
if (count == index){
printf("EXIST:index[%d] = %c",count,p->data);
break;
}
p = p->next;
count++;
}
return 0;
}
main.c
/*
---------------------------------
@author:YoungZorn
created on 2023/5/18 13:53.
---------------------------------
*/
#include "head.h"
int main(){
double_linklist L = create(1);
int n;
datatype e;
printf("number of elements:");
scanf("%d",&n);
for (int i = 0; i < n; i++) { //循环头插
printf("value %d: ",i+1);
scanf(" %c",&e);
insertOnRear(L,e);
}
output(L); //循环输出
// deleteOnRear(L);
// output(L);
// insertByPos(L,4,'A');
// output(L);
// deleteByPos(L,0);
// output(L);
// updateByPos(L,2,'e');
// output(L);
searchByPos(L,3);
return 0;
}