这段内容涉及到链表操作的学习笔记和代码比较。第一部分是前言,指出代码仅供学习参考,未经系统测试。学习版介绍了|这段内容涉及到链表操作的学习笔记和代码比较。第一部分是前言,指出代码仅供学习参考,未经系统测试。学习版介绍了参考网络思路编写的代码,可以操作所有节点但需要实例化一个头节点。巩固版则是独立完成的代码,优点是不浪费一个节点且封装性好,但无法对头节点进行删除和向前插入操作,需要在主函数内进行额外操作。
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
此文章距离最后一次更新已有 478 天, 文章内容可能已经过时.
前言
代码为博主无聊时自己敲的,作为学习笔记,仅供学习参考,未进行系统性测试,不保证其可用性
学习版
此代码思路来源于网络,写于学习链表时
优点:可以很好的操作所有节点,无需在主函数内执行额外操作
缺点:需要实例化一个节点作为头结点并且不能对其进行操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| #include <stdio.h> #include <stdlib.h>
typedef struct Basic_LinkList { int data, id; Basic_LinkList *next;
} LinkList;
LinkList *Creat(int n); void PrintLinkList(LinkList *head); void Change(LinkList *head); void DeleteLinkList(LinkList *head); void HeadInsertLinkList(LinkList *head); void FootInsertLinkList(LinkList *h);
int main() { int n; scanf("%d", &n); LinkList *head = Creat(n); PrintLinkList(head); FootInsertLinkList(head); PrintLinkList(head); getchar(); }
LinkList *Creat(int n) { LinkList *head, *node, *end; head = (LinkList *)malloc(sizeof(LinkList)); end = head; for (int i = 0; i < n; i++) { node = (LinkList *)malloc(sizeof(LinkList)); scanf("%d", &node->data); node->id = i + 1; end->next = node; end = node; } end->next = NULL; return head; }
void Change(LinkList *head) { int n; printf("\n请输入需要修改的节点序号:"); scanf("%d", &n); LinkList *h = head; for (int i = 0; i < n && h != NULL; i++) { h = h->next; } if (h != NULL) { printf("\n请输入需要修改的值:"); scanf("%d", &h->data); } else { printf("\n节点不存在"); } }
void DeleteLinkList(LinkList *head) { int n; printf("\n请输入要删除的节点序号:"); scanf("%d", &n); LinkList *h = head, *last; for (int i = 0; i < n && h != NULL; i++) { last = h; h = h->next; } if (h != NULL) { last->next = h->next; free(h); } else { printf("\n节点不存在"); } }
void HeadInsertLinkList(LinkList *head) { int n, data1; printf("\n请输入需要插入的的节点序号(向前插入):"); scanf("%d", &n); printf("请输入要插入的值:"); scanf("%d", &data1); LinkList *h = head, *last, *mid; mid = (LinkList *)malloc(sizeof(LinkList)); mid->data = data1; for (int i = 0; i < n && h != NULL; i++) { last = h; h = h->next; } if (h != NULL) { last->next = mid; mid->next = h; } else { printf("\n节点不存在"); } }
void FootInsertLinkList(LinkList *head) { int n, data1; printf("\n请输入需要插入的节点序号(向后插入):"); scanf("%d", &n); printf("请输入需要插入的数据:"); scanf("%d", &data1); LinkList *foot, *h, *mid; h = head; mid = (LinkList *)malloc(sizeof(LinkList)); mid->data = data1; for (int i = 0; i < n && h != NULL; i++) { h = h->next; } if (h != NULL) { foot = h->next; mid->next = foot; h->next = mid; } else { printf("\n节点不存在"); } }
void PrintLinkList(LinkList *head) { while (head->next != NULL) { head = head->next; printf("%d ", head->data); } }
|
巩固版
此代码则由自己独立完成
优点:不浪费一个节点(?),封装性好
缺点:无法对头节点进行删除、向前插入操作,需要主函数内有额外操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
| #include <stdio.h> #include <stdlib.h>
typedef struct Point_node { int data; struct Point_node *next;
} LinkList;
LinkList *Creat(int n); void Display(LinkList *head); LinkList *Find(LinkList *head, int pos); LinkList *Change(LinkList *head, int pos, int data); int Delete(LinkList *head, int pos); LinkList *Insert_Backward(LinkList *head, int pos, int data); LinkList *Insert_Forward(LinkList *head, int pos, int data);
int main() { int n; printf("请输入节点数:"); scanf("%d", &n); LinkList *head = Creat(n);
Display(head);
int position = 0, data = 0;
printf("\n请输入需要插入节点的位置与值(向前):"); scanf("%d %d", &position, &data); printf("%d", Insert_Forward(head, position - 1, data)->data); getchar(); }
LinkList *Creat(int n) { LinkList *head = NULL, *end = NULL, *node = NULL; printf("请输入节点数据:"); for (int i = 0; i < n; i++) { if (head == NULL) { head = (LinkList *)malloc(sizeof(LinkList)); head->next = NULL; end = head; scanf("%d", &end->data); } else { node = (LinkList *)malloc(sizeof(LinkList)); node->next = NULL; scanf("%d", &node->data); end->next = node; end = node; } } return head; }
void Display(LinkList *head) { while (1) { if (head == NULL) { break; } else { printf("%d ", head->data); head = head->next; } } }
LinkList *Find(LinkList *head, int pos) { if (head == NULL) { printf("\n节点为空"); return NULL; } if (pos < 0) { printf("\n非法位置!"); return NULL; } int i; for (i = 0; i < pos; i++) { head = head->next; if (head == NULL) { printf("\n位置越界!"); return NULL; } } return head; } LinkList *Change(LinkList *head, int pos, int data) { LinkList *p = Find(head, pos); p->data = data; return p; } int Delete(LinkList *head, int pos) { int data = NULL; LinkList *p = Find(head, pos - 1), *temp;
if (p == NULL) { printf("\n删除失败!"); return NULL; } temp = p->next; p->next = temp->next; data = temp->data; free(temp); return data; }
LinkList *Insert_Backward(LinkList *head, int pos, int data) { LinkList *p = Find(head, pos); if (p == NULL) { printf("\n插入失败!"); return NULL; } LinkList *node = (LinkList *)malloc(sizeof(LinkList)); node->data = data; node->next = p->next; p->next = node; return node; }
LinkList *Insert_Forward(LinkList *head, int pos, int data) { LinkList *p = Find(head, pos - 1);
if (p == NULL) { printf("\n插入失败!"); return NULL; } LinkList *node = (LinkList *)malloc(sizeof(LinkList)); node->data = data; node->next = p->next; p->next = node; return node; }
|