#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Elemtype;
//定义双向链表
//先搞个有头节点单链表
//双向链表要有两个指针域
typedef struct link{
link *prior;
link *next;
Elemtype data;
}link;
//初始化链表
//有头节点
link* initlink(){
//定义头结点
link *node = (link*)malloc(sizeof(link));
//给头节点赋值,单链表
node ->prior = NULL;
node ->next = NULL;
//临时用来遍历的指针
link* temp = node;
//给链表初始化5个有数据结点
for(int i =0;i<5;i++){
//定义新结点
link *newnode = (link*)malloc(sizeof(link));
//给新节点data赋值
newnode->data = i;
newnode->next=NULL; //attention!这里需要把next=NULL,否则printlink时,会检测到temp->next不为NULL,就会不断循环输出.
//将头节点和新结点连接起来
temp->next = newnode;
newnode->prior = temp;
//temp的值变为新节点的值用来循环
temp = temp->next;
}
return node;
}
//打印链表
void printlink(link* head){
link *temp = head;
while(temp->next){
temp = temp->next;
printf("%d->",temp->data);
}
printf("NULL\n");
}
//双向链表的插入
link* insert(link *head,int i,Elemtype e){
link *temp = head;
//遍历到i-1个结点
for(int j =1;j<i;j++){
if(temp==NULL){
printf("你输入的位置有误");
//将原链表返回
return head;
}
temp = temp->next;
}
//在第i个结点的操作
link *newnode = (link*)malloc(sizeof(link));
newnode->data = e;
//将后继结点放入newnode的next域
newnode->next = temp->next;
//将前驱结点地址放入newnode的prior
newnode->prior = temp; //与单向链表的不同
//将插入结点的地址放入后继结点的prior
temp->next->prior = temp; //与单向链表的不同
//将插入结点的地址放入前驱结点的next域
temp->next = newnode;
return head;
}
//对第i个位置进行删除
link *delelem(link*head,int i){
link*temp = head;
for(int j=1;j<i;j++){
if(temp==NULL){
printf("你输入的位置有误");
return head;
}
//遍历到i-1个结点
temp = temp->next;
}
Elemtype e = temp->next->data; //将元素存储防止丢失
//将结点放在q
link *q = temp->next;
//将前后两个结点连接
q->next->prior = temp;
temp->next = q->next;
//释放q
free(q);
return head;
}
int main(){
link *node = initlink();
printlink(node);
node = insert(node,3,3);
printlink(node);
node = delelem(node,4);
printlink(node);
}