将n个非零整数(从键盘输入)存储到单链表L中,且要求所有负数存储到正数前
时间: 2024-01-12 19:04:32 浏览: 79
好的,这是一个单链表的基本操作,首先需要定义一个单链表结构体以及一个链表节点结构体,如下所示:
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
typedef struct List {
ListNode *head;
ListNode *tail;
} List;
```
其中,ListNode 表示链表节点,包括一个整数 val 和指向下一个节点的指针 next;List 表示单链表,包括头结点指针 head 和尾节点指针 tail。
接下来,我们需要编写一个函数,将 n 个非零整数存储到单链表 L 中,并且要求所有负数存储到正数前。具体实现如下:
```c
void insert(List *L, int x) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->val = x;
node->next = NULL;
if (L->head == NULL) {
L->head = node;
L->tail = node;
} else {
ListNode *p = L->head;
ListNode *prev = NULL;
while (p != NULL && p->val >= 0) {
prev = p;
p = p->next;
}
if (prev == NULL) {
node->next = L->head;
L->head = node;
} else {
node->next = prev->next;
prev->next = node;
}
if (p == NULL) {
L->tail = node;
}
}
}
```
这个函数接受一个指向单链表 L 的指针以及一个整数 x,将 x 插入到 L 中。具体实现如下:
- 首先,创建一个新的节点,并将 x 存储到节点的 val 中。
- 如果 L 是空链表,则将头结点和尾节点都指向新节点。
- 否则,我们需要遍历链表,找到第一个非正数的节点,将新节点插入到该节点之前。
- 如果链表中所有节点都是正数,则将新节点插入到链表的末尾。
最后,我们需要编写一个函数,读入 n 个非零整数,并将它们存储到单链表 L 中:
```c
List *createList(int n) {
List *L = (List *)malloc(sizeof(List));
L->head = NULL;
L->tail = NULL;
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
insert(L, x);
}
return L;
}
```
这个函数接受一个整数 n,读入 n 个非零整数,并将它们存储到单链表 L 中。最后,返回指向 L 的指针。
完整代码如下:
阅读全文