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
| #include <stdio.h> #include <stdlib.h> typedef struct Link { int elem; struct Link *next; }link; link * initLink(); // 链表插入的函数, p 是链表, elem 是插入的结点的数据 // 域, add 是插入的位置 link * insertElem(link * p, int elem, int add); // 删除结点的函数, p 代表操作链表, add 代表删除节点的位置 link * delElem(link * p, int add); // 查找结点的函数, elem 为目标结点的数据域的值 int selectElem(link * p, int elem); // 更新结点的函数, newElem 为新的数据域的值 link *amendElem(link * p, int add, int newElem); void display(link *p); int main() { // 初始化链表(1,2,3,4) printf("初始化链表为:\n"); link *p = initLink(); display(p); printf("在第4的位置插入元素5:\n"); p = insertElem(p, 5, 4); display(p); printf("删除元素3:\n"); p = delElem(p, 3); display(p); printf("查找元素2的位置为:\n"); int address = selectElem(p, 2); if (address == -1) { printf("没有该元素"); } else { printf("元素2的位置为:%d\n", address); } printf("更改第3的位置上的数据为7:\n"); p = amendElem(p, 3, 7); display(p); return 0; } link * initLink() { // 创建一个头结点 link * p = (link*)malloc(sizeof(link)); // 声明一个指针指向头结点, 用于遍历链表 link * temp = p; // 生成链表 for (int i = 1; i < 5; i++) { link *a = (link*)malloc(sizeof(link)); a->elem = i; a->next = NULL; temp->next = a; temp = temp->next; } return p; } link * insertElem(link * p, int elem, int add) { // 创建临时结点temp link * temp = p; // 首先找到要插入位置的上一个结点 for (int i = 1; i < add; i++) { temp = temp->next; if (temp == NULL) { printf("插入位置无效\n"); return p; } } // 创建插入结点 c link * c = (link*)malloc(sizeof(link)); c->elem = elem; // 向链表中插入结点 c->next = temp->next; temp->next = c; return p; } link * delElem(link * p, int add) { link * temp = p; // 遍历到被删除结点的上一个结点 for (int i = 1; i < add; i++) { temp = temp->next; if (temp->next == NULL) { printf("没有该结点\n"); return p; } } // 单独设置一个指针指向被删除结点, 以防丢失 link * del = temp->next; // 删除某个结点的方法就是更改前一个结点的指针域 temp->next = temp->next->next; // 手动释放该结点, 防止内存泄漏 free(del); return p; } int selectElem(link * p, int elem) { link * t = p; int i = 1; while (t->next) { t = t->next; if (t->elem == elem) { return i; } i++; } return -1; } link *amendElem(link * p, int add, int newElem) { link * temp = p; // temp 指向首元结点 temp = temp->next; // temp 指向被删除结点 for (int i = 1; i < add; i++) { temp = temp->next; } temp->elem = newElem; return p; } void display(link *p) { // 将 temp 指针重新指向头结点 link* temp = p; // 只要 temp 指针指向的结点的 next 不是 Null, 就执行输出语句 while (temp->next) { temp = temp->next; printf("%d ", temp->elem); } printf("\n"); } /* 初始化链表为: 1 2 3 4 在第4的位置插入元素5: 1 2 3 5 4 删除元素3: 1 2 5 4 查找元素2的位置为: 元素2的位置为:2 更改第3的位置上的数据为7: 1 2 7 4 */
|