在结点类型为DuLNode的双向链表中,给出将p所指结点(非尾结点)与其后继结点交换的操作的代码
时间: 2023-06-01 13:01:25 浏览: 33
```
// 假设p不是尾结点
DuLNode *temp = p->next; // 保存p的后继结点
p->next = temp->next;
temp->next->prior = p;
temp->next = p;
temp->prior = p->prior;
p->prior->next = temp;
p->prior = temp;
```
相关问题
写出实现双向链表的建表、销毁表、清空表、判断空、求表长度、按值查找等基本操作的C语言程序代码
双向链表结构体定义:
```c
typedef struct DuLNode {
ElemType data; // 数据域
struct DuLNode *prior; // 指向前驱结点
struct DuLNode *next; // 指向后继结点
} DuLNode, *DuLinkedList;
```
建表操作:
```c
void CreateList(DuLinkedList *L, int n) {
*L = (DuLinkedList) malloc(sizeof(DuLNode));
(*L)->prior = NULL;
(*L)->next = NULL;
DuLinkedList p = *L;
for (int i = 0; i < n; i++) {
DuLinkedList q = (DuLinkedList) malloc(sizeof(DuLNode));
scanf("%d", &q->data);
q->prior = p;
q->next = p->next;
p->next = q;
p = q;
}
}
```
销毁表操作:
```c
void DestroyList(DuLinkedList *L) {
DuLinkedList p = (*L)->next;
while (p != NULL) {
DuLinkedList q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
}
```
清空表操作:
```c
void ClearList(DuLinkedList L) {
DuLinkedList p = L->next;
while (p != NULL) {
DuLinkedList q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
```
判断空操作:
```c
bool ListIsEmpty(DuLinkedList L) {
return L->next == NULL;
}
```
求表长度操作:
```c
int ListLength(DuLinkedList L) {
int len = 0;
DuLinkedList p = L->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
```
按值查找操作:
```c
DuLinkedList GetElem(DuLinkedList L, ElemType e) {
DuLinkedList p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
```
数据结构双链表基本操作
双向链表的基本操作包括:判断链表是否为空、计算链表的长度、遍历链表。判断链表是否为空和计算链表的长度的方法和单链表一样,主要和双向链表中的指向后继的指针有关。遍历链表时,需要遍历指向后继的指针和指向前驱的指针。
双向链表的插入操作和单链表有所不同。插入操作需要修改指向前驱和指向后继的指针。具体的算法思想和单链表的思想相同,只是修改的指针不同。
下面是一个双向链表插入操作的示例代码:
```c++
int ListInsert(DuLinkList &L, int i, int e) {
// 在双向链表的第i个位置之前插入元素e,1<=i<=表长
struct DuLNode *p;
p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) {
return 0;
}
DuLNode *s; // 生成要插入的结点
s = new DuLNode;
s->data = e;
p->next->prior = s;
s->next = p->next;
p->next = s;
s->prior = p;
return 1;
}
```
以上是双向链表的基本操作,可以根据这些操作进行双向链表的创建、插入、删除等操作。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)