链表2(插入结点的同时排序)

本文介绍了一个使用C语言实现的单链表数据结构,包括创建、插入、显示及释放链表的基本操作。该链表按数值顺序自动排序,方便理解和学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
char name[20];


struct node *next;
};


typedef struct node Node;
typedef struct node *Link;


void create_link(Link  *head)
{
*head = NULL;
}


void insert_link(Link *head,Link new_node,int num)  //插入第n个结点,值为num
{
if(*head == NULL)
{
*head = new_node;
new_node->next = NULL;
}

else
{
Link p = *head;
Link q = *head;


if(num < (*head)->num)                            //头插
{
new_node->next = *head;
*head = new_node;
}


else
{
while(q != NULL && num > q->num)    
{
p = q;
q = q->next;
}


if(q == NULL)                                    //尾插
{
p->next = new_node;
new_node->next = NULL;
}


else                                                    // 中间插
{
new_node->next = q;
p->next = new_node;
}
}
}


}


void display_link(Link head,Link new_node)
{
new_node = head;


if(new_node == NULL)
{
printf("Empty!\n");
return;
}
else
{
while(new_node != NULL)
{
printf("num = %d  name = %s\n",new_node->num,new_node->name);
new_node = new_node->next;


}
}


}

void release_link(Link *head,Link new_node)
{
while(*head != NULL)
{
new_node = *head;
*head = (*head)->next;
free(new_node);
}
}


int main()
{
int num;
int i,n;


Link head = NULL;
Link new_node = NULL;


create_link(&head);


printf("Please input the number(node number) :\n"); //输入链表长度
       scanf("%d",&n);


for(i = 1;i <= n;i++)
{
new_node = (Link)malloc(sizeof(Node));


if(new_node ==NULL)
{
printf("malloc error!\n");
exit(-1);
}
printf("Please input num and name:\n");


scanf("%d",&num);


new_node->num = num;


scanf("%s",new_node->name);


insert_link(&head,new_node,num);


}


display_link(head,new_node);


printf("Now release it:\n");


release_link(&head,new_node);


display_link(head,new_node);


    return 0;
}
### 如何在链表插入节点 在链表插入节点的操作需要根据链表的类型(单向链表或双向链表)以及插入位置的不同而有所变化。以下是两种常见链表类型的插入方法及其示例代码。 #### 单向链表插入节点 在单向链表插入节点时,通常需要遍历链表以找到插入的合适位置,调整指针关系。以下是一个在已排序单向链表插入新节点的示例代码[^2]: ```c #include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode* next; }; void insertNode(struct ListNode** head, int value) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = value; newNode->next = NULL; if (*head == NULL || (*head)->data >= value) { newNode->next = *head; *head = newNode; return; } struct ListNode* current = *head; while (current->next != NULL && current->next->data < value) { current = current->next; } newNode->next = current->next; current->next = newNode; } void printList(struct ListNode* node) { while (node != NULL) { printf("%d -> ", node->data); node = node->next; } printf("NULL\n"); } int main() { struct ListNode* head = NULL; insertNode(&head, 10); insertNode(&head, 5); insertNode(&head, 15); insertNode(&head, 7); printList(head); // 输出: 5 -> 7 -> 10 -> 15 -> NULL return 0; } ``` #### 双向链表插入节点 在双向链表插入节点时,除了调整`next`指针外,还需要调整`prev`指针以确保链表结构的完整性。以下是一个在指定节点后插入新节点的示例代码[^4]: ```c #include <stdio.h> #include <stdlib.h> struct DListNode { int data; struct DListNode* next; struct DListNode* prev; }; void insertAfter(struct DListNode* temp, int value) { if (temp == NULL) { printf("The given previous node cannot be NULL"); return; } struct DListNode* newNode = (struct DListNode*)malloc(sizeof(struct DListNode)); newNode->data = value; newNode->next = temp->next; newNode->prev = temp; if (temp->next != NULL) temp->next->prev = newNode; temp->next = newNode; } void printList(struct DListNode* node) { while (node != NULL) { printf("%d <-> ", node->data); node = node->next; } printf("NULL\n"); } int main() { struct DListNode* head = NULL; struct DListNode* second = NULL; struct DListNode* third = NULL; head = (struct DListNode*)malloc(sizeof(struct DListNode)); second = (struct DListNode*)malloc(sizeof(struct DListNode)); third = (struct DListNode*)malloc(sizeof(struct DListNode)); head->data = 1; head->next = second; head->prev = NULL; second->data = 2; second->next = third; second->prev = head; third->data = 3; third->next = NULL; third->prev = second; insertAfter(second, 4); printList(head); // 输出: 1 <-> 2 <-> 4 <-> 3 <-> NULL return 0; } ``` #### 插入操作的关键点 - 在单向链表插入节点时,需要找到插入位置正确设置`next`指针[^1]。 - 在双向链表插入节点时,除了设置`next`指针外,还需要设置`prev`指针以维护链表的双向性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值