用c语言编写算法,根据用户输入的字符数据用尾插入法创建一个带头结构的单链表,“#”作为数据输入的结束符。
时间: 2024-05-01 13:16:55 浏览: 93
尾插入法”即将新节点插入到链表的末尾。
首先,我们需要定义一个结构体来表示链表节点:
```c
typedef struct node {
char data;
struct node* next;
} Node;
```
其中,`data`表示节点存储的字符数据,`next`表示指向下一个节点的指针。
接下来,我们可以编写一个函数来创建链表:
```c
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 头结点的next指针初始化为NULL
Node* tail = head; // tail指针指向头结点,表示链表的末尾
char c;
printf("请输入字符数据,以#结束:\n");
while ((c = getchar()) != '#') {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = c;
newNode->next = NULL;
tail->next = newNode; // 将新节点插入到链表末尾
tail = newNode; // 更新tail指针
}
return head;
}
```
在该函数中,我们首先创建头结点,并将其next指针初始化为NULL。接着,我们使用一个循环来读取用户输入的字符数据,每读取一个字符就创建一个新节点,并将其插入到链表末尾。最后,我们返回头结点的指针。
使用该函数可以创建一个带头结构的单链表,例如:
```c
Node* list = createList();
```
需要注意的是,在使用完链表后,我们需要释放链表中所有节点的内存空间,可以编写一个函数来实现:
```c
void destroyList(Node* head) {
Node* p = head;
while (p != NULL) {
Node* q = p;
p = p->next;
free(q);
}
}
```
在该函数中,我们首先定义一个指针p指向链表的头结点,然后使用循环遍历链表中的所有节点,依次释放它们的内存空间。最后,我们释放头结点的内存空间,并将其指针设置为NULL,以防止野指针的出现。例如:
```c
destroyList(list);
list = NULL;
```
阅读全文