C++双向链表及操作

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:23   2149   0

其实会了单向链表,写双向链表其实是一样的。最重要的是,其实链表之间相连的理解不应该简简单单地理解为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;

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP