双向链表的定义,初始化,插入,删除,并编写一个读入一个字符串,把它顺序存入一个双向链表并逆序打印出 点击复制后,将打开C知道体验页
时间: 2023-06-15 13:07:25 浏览: 94
JS双向链表实现与使用方法示例(增加一个previous属性实现)
双向链表是一种链式数据结构,每个节点除了存储数据外,还包含指向前一个节点和后一个节点的指针。以下是双向链表的定义:
```c
typedef struct node{
int data;
struct node *prev;
struct node *next;
} Node;
typedef struct {
Node *head;
Node *tail;
int size;
} DoublyLinkedList;
```
其中,`head`指向双向链表的头节点,`tail`指向双向链表的尾节点,`size`表示双向链表的大小。节点定义了`data`存储数据,`prev`指向前一个节点,`next`指向下一个节点。
以下是双向链表的初始化:
```c
void initDoublyLinkedList(DoublyLinkedList *list) {
list->head = NULL;
list->tail = NULL;
list->size = 0;
}
```
插入一个节点到双向链表:
```c
void insertNode(DoublyLinkedList *list, int data) {
Node *node = (Node *) malloc(sizeof(Node));
node->data = data;
node->prev = list->tail;
node->next = NULL;
if (list->tail) {
list->tail->next = node;
} else {
list->head = node;
}
list->tail = node;
list->size++;
}
```
删除一个节点:
```c
void deleteNode(DoublyLinkedList *list, Node *node) {
if (node == list->head) {
list->head = node->next;
} else {
node->prev->next = node->next;
}
if (node == list->tail) {
list->tail = node->prev;
} else {
node->next->prev = node->prev;
}
free(node);
list->size--;
}
```
读入一个字符串,把它顺序存入一个双向链表并逆序打印出:
```c
void reversePrint(DoublyLinkedList *list) {
Node *node = list->tail;
while (node) {
printf("%d ", node->data);
node = node->prev;
}
}
void insertString(DoublyLinkedList *list, char *str) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
insertNode(list, str[i]);
}
}
int main() {
DoublyLinkedList list;
initDoublyLinkedList(&list);
char str[100];
printf("Enter a string: ");
scanf("%s", str);
insertString(&list, str);
printf("Reversed string: ");
reversePrint(&list);
return 0;
}
```
阅读全文