15 在特定结点前插入新的元素

这里是在第三个结点之前插入一个值

 1 /*在特定(第三个结点)结点之前插入元素*/
 2 
 3 
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 
 7 //链表中节点的结构
 8 typedef struct Link {
 9     int  data;
10     struct Link* next;
11 }link;
12 
13 //链表初始化
14 link* initByTailInsert() {
15     link* phead = NULL;//创建头指针
16     link* first_node = (link*)malloc(sizeof(link));//创建第一个节点
17     //第一个结点先初始化
18     first_node->data = 1;
19     first_node->next = NULL;
20     phead = first_node;//头指针指向第一个节点
21 
22     //尾插入赋值
23     for (int i = 2; i < 5; i++) {
24         link* new_node = (link*)malloc(sizeof(link)); //申请新的结点
25         new_node->data = i;
26         new_node->next = NULL;
27         first_node->next = new_node;  //第一个结点的指针域指向这个新申请的结点
28         first_node = new_node;  //第一个结点后移
29     }
30 
31     printf("头指针指向的值是:%d\n", phead->data);//1
32     return phead;  //将指向第一个结点的头指针返回
33 }
34 
35 
36 
37 void showLink(link* phead) {
38     link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针
39     //只要tmp指针指向的结点的next不是Null,就执行输出语句。
40     while (tmp != NULL) {
41         printf("%d ", tmp->data);
42         tmp = tmp->next;
43     }
44     printf("\n");
45 }
46 
47 link* getElemByNum(link* phead,int num) {
48     int j = 1; //计数器
49     link* tmp = phead;
50     while (tmp != NULL && num>j) {
51         tmp = tmp->next;
52         j++;
53     }
54     if (tmp == NULL || num<j) {
55         //printf("这个元素不存在\n");
56         return NULL;
57     }
58     else {
59         return tmp;
60     }
61 }
62 
63 //第三个结点前插入一个数
64 void insertElem(link* phead,int elem1,int elem2) {
65     link* tmp = phead;
66     link* front_node = getElemByNum(tmp,elem1 - 1);
67     link* insert_node = (link*)malloc(sizeof(link));
68     insert_node->data = elem2;
69     insert_node->next = getElemByNum(tmp,elem1);
70     front_node->next = insert_node;
71     showLink(tmp);
72 
73 }
74 
75 //求链表的表长
76 int getLinkLength(link* phead) {
77     link* tmp = phead;
78     int len = 0;
79     while (tmp != NULL) {
80         len++;
81         tmp = tmp->next;
82     }
83     return len;
84 }
85 
86 void main() {
87     //初始化链表(1,2,3,4)
88     printf("初始化链表为:\n");
89     link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针
90     showLink(phead);
91 
92     int value = 0;
93     printf("请输入在第三个结点之前准备插入的值:");
94     scanf("%d", &value);
95     printf("第3个结点前插入%d后的链表是:\n", value);
96     insertElem(phead,3, value);
97     printf("表的长度是:%d\n", getLinkLength(phead));
98 
99 }

 

posted @ 2020-03-11 00:34  shanlu  阅读(333)  评论(0编辑  收藏  举报