C链表的增删查改

本文深入解析了链表的基本操作,包括初始化、插入、删除、修改节点以及如何进行链表的遍历与打印。通过实例代码,详细展示了每个操作的实现过程和具体步骤。

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

/**
002  * @todo    c链表操作:CURD
003  * @author Koma
004  **/
005 #include<stdio.h>
006 #include<stdlib.h>
007  
008 typedef struct node{
009     int data;
010     struct node *next;
011 }LNode, *LinkList;
012  
013 /**
014  * 初始化并创建一个带头节点的链表
015  **/
016 LinkList init( int len ) {
017     int i;
018     LinkList p, r, list;
019     list = (LinkList)malloc(sizeof(LNode));
020     list->next = NULL;
021     for ( i = 0; i < len; i++ ) {
022         p = (LinkList)malloc(sizeof(LNode));
023         p->data = i+1;
024         p->next = NULL;
025         if ( !list->next ) {
026             list->next = p;  //赋值头节点
027         else {
028             r->next = p;
029         }
030         r = p;  //移动r指针,指向下一个节点
031     }
032     return list;
033 }
034  
035 /**
036  * 插入元素
037  * @param int n 插入的位置
038  * @param int e 插入的值
039  **/
040 void insertEle( LinkList l, int n, int e ) {
041     LinkList p, q, ele;
042     int i = 1;
043     ele = (LinkList)malloc(sizeof(LNode));
044     ele->data = e;
045     ele->next = NULL;
046     p = q = l->next;
047      
048     if ( n == 1 ) {         //将元素添加到链表头
049         l->next = ele;
050         ele->next = q;
051         return;
052     }
053     while ( i != n && q->next != NULL ) {
054         p = q;
055         q = q->next;
056         i++;
057     }
058     if ( i == n ) {
059         p->next = ele;
060         ele->next = q;
061     else if( i < n ) { //将元素添加到链表尾
062         q->next = ele;
063     }
064 }
065  
066 /**
067  * 删除节点
068  * @param int n 欲删除节点的位置
069  **/
070 void delNode( LinkList l, int n ) {
071     LinkList p, q;
072     int i = 1;
073     p = q = l->next;
074     if ( n == 1 ) {
075         l->next = q->next;
076     else {
077         while ( i != n && q->next != NULL ) {
078             p = q;
079             q = q->next;
080             i++;
081         }
082         if ( i == n ) {
083             p->next = q->next;
084         }
085     }
086 }
087  
088 /**
089  * 修改节点
090  * @param int n 欲修改节点的位置
091  * @param int e 修改值
092  **/
093 void updateNode( LinkList l, int n, int e ) {
094     LinkList q;
095     int i = 1;
096     q = l->next;
097     while ( i != n && q->next != NULL ) {
098         q = q->next;
099         i++;
100     }
101     if ( i == n ) {
102         q->data = e;
103     }
104 }
105  
106 /**
107  * 打印链表
108  **/
109 void printLink( LinkList l ) {
110     LinkList q;
111     q = l->next;
112     while ( q->next != NULL ) {
113         printf("%d ", q->data);
114         q = q->next;
115     }
116     printf("%d\n", q->data); //打印最后一个元素
117 }
118  
119 int main() {
120         LinkList l;
121     l = init(5);
122     printLink(l);
123     insertEle(l, 6, 10);
124     printLink(l);
125     delNode(l, 2);
126     printLink(l);
127     updateNode(l, 6, 22);
128     printLink(l);
129     return 0;
130 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值