其实会了单向链表,写双向链表其实是一样的。最重要的是,其实链表之间相连的理解不应该简简单单地理解为p -> next = L诸如此类的,因为p -> next的->也是一种指针,不过是内部指针。所以并不是p指向L,而是p地址中存放的那个结构体中存放的next地址指向了L。详情可以看http://blog.csdn.net/qq_36523667/article/details/79016795中画的图,从内存角度去理解。
typedef int ElemType;
struct Node {
ElemType data;
struct Node*pre;
struct Node *next;
}Node, *LinkedList;
LinkedList initEmptyLinkedList() {
Node *L;
L = (* Node)malloc (sizeof(Node));
if (L == null)
printf(“分配内存空间失败”);
return NULL;
L -> pre =null;
L -> next =null;
return L;
}
LinkedList createFromHead() {
Node *L;
L = (* Node)mallloc(sizeof(Node));
if (L = null) {
printf(“分配内存空间失败”);
return NULL;
}
L -> pre = NULL;
L -> next = NULL;
while(scanf(“%d”,&x) != EOF) {
Node*n;
n = (*Node) malloc (sizeof(Node));
if(n == NULL) {
printf(“分配内存空间失败”);//其实这里应该释放所有分配的节点,因为已错了
return L;
}
n -> pre = NULL;
n -> next =NULL;
n -> next = L -> next;
L -> next = n;
n -> pre = L;
L -> next -> pre = n;
}
return L;
}
LinkedList createFromEnd() {
Node *L;
L = (Node *)malloc (sizeof(Node));
if (L = NULL) {
printf(“分配内存空间失败”);
return NULL;
}
L -> pre =NULL;
L -> next=NULL;
Node *cur;
cur = L;
while(scanf(“%d”,&x) != EOF) {
Node*n;
n = (*Node) malloc (sizeof(Node));
if(n == NULL) {
printf(“分配内存空间失败”);
return L;
}
n-> pre = NULL;
n-> next = NULL;
cur-> next = n;
n-> pre = cur;
cur =n;
}
}
LinkedList insertLinkedList(LinkedList L,int i, ElemType data) {
Node *cur;
cur = L;
int tempi;
for(tempi = 1;tempi< i; tempi ++) {
cur =L -> next;
}
Node *n;
n = (* Node)malloc(sizeof(Node));
n -> data =data;
n -> pre =NULL;
n -> next=NULL;
cur -> next ->pre = n -> next;
n -> next =cur -> next;
cur -> next =n;
n -> pre =cur;
return L;
}
Boolean deleteLinkedList(LinkedList L,ElemType data) {
Node *cur;
cur = L;
while (true) {
if (cur= NULL) {
printf(“没找到”);
returnfalse;
}
if (cur-> data = data) {
cur -> next -> pre = cur -> pre;
cur -> pre -> next = cur->next;
free(cur);
returntrue;
}else {
cur = cur -> next;
}
}
return L;
}