双向链表
在双向链表中头节点包含两个指针域(first和tail)。
first指向第一个结点,tail指向最后一个结点
每个结点包含两个指针域和一个数据域,数据域用来保存数据。
两个指针域分别为front和next,front指向当前结点的前驱,next指向当前结点的后继。
第一个结点没有前驱,最后一个结点没有后继
双向链表的基本操作
1.结构
//双向链表结构
struct node{
struct node *front;
int data;
struct node *next;
};
//头节点结构
struct headNode{
struct node *first;
struct node *tail;
};
2.初始化
struct headNode * initHeadNode(){
struct headNode *h = (struct headNode *)malloc(sizeof(struct headNode));
h->first = NULL;
h->tail = NULL;
return h;
}
3.输入数据
//输入数据
void inputData(struct headNode *h){
int data;
struct node *p;
while(1){
printf("Please input data : ");
scanf("%d",&data);
if(data == 0){
break;
}
if(h->first == h->tail && h->first == NULL && h->tail == NULL){
p = (struct node *)malloc(sizeof(struct node));
p->data = data;
p->front = NULL;
p->next = NULL;
h->first = p;
h->tail = p;
}else{
p = (struct node *)malloc(sizeof(struct node));
p->data = data;
p->front = h->tail;
p->next = NULL;
h->tail->next = p;
h->tail = p;
}
}
}
4.输出数据
//输出数据
void outputData(struct headNode *h){
struct node *p;
p = h->first;
while(p){
printf(" %d ",p->data);
p = p->next;
}
printf("\n");
}
//反向输出数据
void adverseOutputData(struct headNode *h){
struct node *p;
p = h->tail;
while(p){
printf(" %d ",p->data);
p = p->front;
}
printf("\n");
}
5.求长度
//求长度
int length(struct headNode *h){
struct node *p;
p = h->first;
int length = 0;
while(p){
p = p->next;
length++;
}
return length;
}
6.插入数据
void insertData(struct headNode *h,int loc,int data){
struct node *p;
p = h->first;
int i = 1;
//根据位置找到节点
while(i<loc){
p = p->next;
i++;
}
//开始插入
struct node *newNode = (struct node *)malloc(sizeof(struct node));
newNode->data = data;
newNode->front = p;
newNode->next = p->next;
p->next->front = newNode;
p->next = newNode;
}
7.删除数据
void delData(struct headNode *h,int loc){
struct node *p = h->first;
int i = 0;
while(i<loc){
p = p->next;
i++;
}
//开始删除
struct node *delData = p;
p->front->next = p->next;
p->next->front = p->front;
free(p);
}
8.main函数调用测试
int main(){
struct headNode *h = initHeadNode();
if(h){
printf("--->>>Init Success!!!\n");
inputData(h);
outputData(h);
adverseOutputData(h);
printf("insert alter:");
insertData(h,2,66);
outputData(h);
printf("length : %d\n",length(h));
printf("delete alter");
delData(h,2);
outputData(h);
printf("length : %d\n",length(h));
}
}