雙向鏈表

雙向鏈表對於單向鏈表在節點結構中多了一個前向指針,指向前一個節點。

C語言實現:

//節點

typedef struct double_list {

double_list* next;
double_list* bef;
int data;
}list;


//在頭節點插入新節點
void add_head_node(list* head,int data) {
list*p = (list*)malloc(sizeof(list));
if (p == NULL) { printf("add error.\n"); return; }
list* q = head->next;
head->next = p;
p->bef = head;
p->next = q;
p->data = data;
}


//在節點的尾部插入
void add_last_node(list* head,int data) {
list*p = (list*)malloc(sizeof(list));

if (p == NULL) { printf("add error.\n"); return; }

list* q = head;
while (q->next != NULL) {
q = q->next;
}

q->next = p;
p->bef = q;
p->next = NULL;
p->data = data;
}

//統計節點的個數
int node_num(list* head) {
list* q = head;
int num = 0;
while (q->next!=NULL) {
q = q->next;
num++;
}
return num;
}

//在第i個節點處添加節點
void add_i_node(list* head,int i,int data) {
list* p = (list*)malloc(sizeof(list));
if (p == NULL) { printf("add error.\n"); return; }
if (i > node_num(head))add_last_node(head,data);
list* q = head;
int num=0;
while (1) {
if (num == i - 1)break;
q = q->next;
num++;
}
list* temp = q->next;
q->next = p;
p->bef = q;
p->next = temp;
p->data = data;
temp->bef = p;
}

//遍歷整個鏈表
void see_list(list* head) {
list* q = head;
int num = 0;
while (q->next != NULL) {
q = q->next;
num++;
printf("node_%d = %d.\n",num,q->data);
}
}

//刪除第i個節點
void del_i_node(list* head,int i) {
if (i > node_num(head)) { printf("del i error\n"); return; }
if (i < 1) { printf("del i error\n"); return; }
list* q = head;
int num = 0;
while (1) {
if (num == i - 1)break;
q = q->next;
num++;
}
list* temp = q->next;
q->next = temp->next;
temp->bef = q;
free(temp);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章