在一个有序的链表上插入一个节点,使得插入节点后的链表仍然有序
#include<stdio.h>
#define N 5
struct Node
{
int data;
struct Node *next;
};
//创建链表并初始化数据
struct Node *create()
{
int i;
struct Node *head,*p1,*p2;
head = p1 = p2 = (struct Node*)malloc(sizeof(struct Node));
head->data = 89101;
for(i=1; i<N; i++)
{
p1 = (struct Node*)malloc(sizeof(struct Node));
p1->data = 89102+2*i-1;
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
return head;
}
//插入一个节点
void insert(struct Node *head, struct Node *p)
{
struct Node *pt = head;
int temp;
while(pt != NULL)
{
if(p->data < pt->data)
{
break;
}
pt = pt->next;
}
//将找到的大于p中的数据值的节点和p的数据进行交换
temp = pt->data;
pt->data = p->data;
p->data = temp;
//现在pt存储的是p的数据,p存储的是pt的数据,构造连接pt->p->
p->next = pt->next;
pt->next = p;
}
void main()
{
int i;
struct Node *head,*pt;
//创建一个链表
head = pt = create();
//创建一个新节点
struct Node *p;
p = (struct Node*)malloc(sizeof(struct Node));
p->data = 89102;
printf("链表初始数据:\n");
while(pt)
{
printf("%d\n", pt->data);
pt = pt->next;
}
printf("\n插入节点%d:\n", p->data);
//插入链表
insert(head, p);
pt = head;
while(pt)
{
printf("%d\n", pt->data);
pt = pt->next;
}
//插入一个节点
p = (struct Node*)malloc(sizeof(struct Node));
p->data = 89106;
printf("\n插入节点%d:\n", p->data);
insert(head, p);
pt = head;
while(pt)
{
printf("%d\n", pt->data);
pt = pt->next;
}
//插入一个节点
p = (struct Node*)malloc(sizeof(struct Node));
p->data = 89107;
printf("\n插入节点%d:\n", p->data);
insert(head, p);
pt = head;
while(pt)
{
printf("%d\n", pt->data);
pt = pt->next;
}
}
分享到:
相关推荐
算法的核心是在遍历链表A的同时,根据B链表节点的学号大小插入到正确的位置,保持学号的升序排列。这涉及到对两个链表的节点进行比较,并适当调整指针指向,以完成插入操作。 3. **遍历链表**:`void print(struct ...
这可以方便地存储和处理多个字符串,例如实现一个按字典序排序的字符串链表。 4. **链表操作示例** - **插入**:在链表的特定位置插入一个`std::string`,需要找到插入位置的前一个节点,然后更新它的`next`指针。...
这需要我们在插入时比较字符串的字典序,确保链表始终有序。我们可以遍历链表,找到合适的位置插入新字符串,或者在链表末尾插入如果新字符串是最大的。 2. **重复字符串的处理**:如果尝试插入已存在于链表中的...
此外,循环链表是链表的一种变体,最后一个节点指向第一个节点,形成一个环。 栈是一种“后进先出”(LIFO)的数据结构,常用于处理函数调用、表达式求值等。在栈中,最后压入的元素最先弹出。栈的主要操作包括压栈...
- 列表中,节点按着列序(同一列内按行序)链接,使用`down`域。 - 这两个链表共享一个头节点,并且额外有一个包含矩阵维数的结点。 3. **链表操作**: - 插入新节点:根据行和列索引,找到合适的插入位置,更新...
如果第一个链表的节点值小于或等于第二个链表的节点值,就将第一个链表的节点插入到结果链表中,并逆置链表的指向,以此类推,直到其中一个链表遍历完。剩下的链表部分直接逆置插入到结果链表中。 第二个问题来自...
3. **尾部插入法**:在链表的末尾插入节点。先创建一个空链表,然后逐个读取数据,每次插入新节点到链表尾部,最后更新最后一个节点的next指针。 4. **求表长**:遍历整个链表,用一个计数器记录经过的节点数量,...
- **链表操作**:包括创建新节点、插入节点、删除节点以及遍历链表等功能。 #### 算法设计与实现 1. **输入**: - 创建空链表。 - 输入多项式的系数和指数,创建对应节点并插入到链表中,确保链表有序。 2. **...
链表的节点通常包含以下几个数据域:家电名称、品牌型号、单价和数量。这些字段对应了商品的基本属性,其中家电名称和品牌型号为字符串类型,单价为浮点型,商品号和商品数量则为整型。在系统中,用户可以通过手动...
具体流程是遍历整个链表,对每个节点进行调整,使其按序排列。 4. **输出操作** ```c void Output(List SL) { // ...代码省略... } ``` 最后,通过遍历链表输出排序后的结果。 #### 四、关键点总结 1. **...
链表操作包括插入节点(构造链表)、删除节点(出列操作)和遍历链表(输出出列顺序)。 **详细设计说明**中提到的基本操作包括: - **Data_InPut()**:创建链表并输入数据。这一函数会先初始化一个空链表,然后...
按序查找则需要在特定位置插入或删除节点,可能需要对链表进行部分重新排列。 - **单链表的删除**:删除操作分为按值查找和按序查找。按值查找找到匹配节点后删除,按序查找则在指定位置删除。 - **单链表的插入**...
`ListInsert`函数实现了员工信息的插入操作,它根据员工姓名的字典序在链表中找到合适的位置进行插入,确保链表始终按姓名顺序排列。如果链表为空,新节点直接插入头部;否则,遍历链表找到合适位置并插入。插入过程...
6. Add Records from a Text File:从文本文档输入学生记录并按序插入已有列表。 7. Write to a Text File:将列表写入指定位置的文档。 8. Reverse List:将现有列表按逆序存放。 9. Delete the Same Record:删除...
1. **增加商铺**:创建一个指针`p`,移动到链表尾部,然后从文件`increase.txt`读取数据,创建新的节点插入链表,并更新文件`change.txt`。 2. **删除商铺**:通过指针定位到待删除节点,删除节点后如果还有节点,...
在上述代码中,`SingleLinkedList`类包含了添加、按序添加、更新和删除节点的方法。`add`方法遍历链表找到最后一个节点,然后将新节点插入其后。`addByOrder`方法则查找适当的插入位置,确保新节点按编号顺序排列。`...
在解决多项式相加的问题上,由于事先建立的多项式函数已经按指数大小排好序,我们可以直接进行相加操作。首先,我们将比较两个多项式的指数值,如果指数值相同,则将系数值相加;否则,将较小的指数值插入到结果...
例如,访问元素和按序号存取操作的时间复杂度为O(1),而插入和删除操作的时间复杂度一般为O(n)。 3. 链表表示的线性表,其插入和删除操作的时间复杂度为O(1),前提是已知待操作的节点位置,否则查找节点的时间...
- **成绩单输出**:采用对称序遍历二叉排序树,依次输出每个学生节点的链表中的所有成绩。 3. **设计理由**: - 选择二叉排序树和链表结构,因为它们能提供高效的插入(O(nlog2n))、查找(O(log2n))和输出(O(n...