链表实现

  1. 定义链表结点结构体
  1. typedef struct node {
  2. int val;
  3. struct node* next;
  4. } MyLinkedList, node;
  1. 创建一个链表,即创建一个头结点
  1. MyLinkedList* myLinkedListCreate() {
  2. MyLinkedList * obj = (MyLinkedList*)malloc(sizeof(node));
  3. obj->next = NULL;
  4. return obj;
  5. }
  1. 在链表首元结点之前添加一个结点,作为新的首元结点
  1. void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
  2. node * newNode = (node*)malloc(sizeof(node));
  3. newNode->val = val;
  4. newNode->next = obj->next;
  5. obj->next = newNode;
  6. }
  1. 在链表尾结点之后添加一个结点,作为新的尾结点
  1. void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
  2. node * newNode = (node*)malloc(sizeof(node));
  3. newNode->val = val;
  4. newNode->next = NULL;
  5. node* p = obj;
  6. while(p->next != NULL)
  7. p = p->next;
  8. p->next = newNode;
  9. }
  1. 在指定位置插入一个结点,值为val
  1. int myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
  2. node* p = obj;
  3. int j = 0;
  4. while (p && j < index) {
  5. p = p->next;
  6. ++j;
  7. }
  8. if (!p || j > index){
  9. printf("ERROR!\n");
  10. return -1;
  11. }
  12. node* newNode = (node*)malloc(sizeof(node)); // 生成新结点
  13. newNode->val = val;
  14. newNode->next = p->next;
  15. p->next = newNode;
  16. return 0;
  17. }
  1. 删除指定位置的结点
  1. int myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
  2. node* p = obj;
  3. int j = 0, val = 0;
  4. while (p->next && j < index) {
  5. p = p->next;
  6. ++j;
  7. }
  8. if (!(p->next) || j > index){
  9. printf("ERROR!\n");
  10. return -1;
  11. }
  12. node* q = p->next;
  13. p->next = q->next; // 删除并释放结点
  14. val = q->val;
  15. free(q);
  16. return val;
  17. }
  1. 获取索引号为index的节点的数值,如果索引号错误则返回-1
  1. int myLinkedListGet(MyLinkedList* obj, int index) {
  2. node* p = obj->next;
  3. int j = 0;
  4. while (p && j<index) {
  5. p = p->next;
  6. ++j;
  7. }
  8. if (!p || j>index){
  9. printf("ERROR!\n");
  10. return -1;
  11. }
  12. return p->val;
  13. }
  1. 释放链表
  1. void myLinkedListFree(MyLinkedList* obj) {
  2. MyLinkedList * Transit;
  3. while(obj->next != NULL) {
  4. Transit = obj;
  5. obj = obj->next;
  6. free(Transit);
  7. }
  8. free(obj);
  9. }
  1. 打印链表
  1. void showAll(MyLinkedList* obj) {
  2. if(obj->next == NULL) return;
  3. MyLinkedList *mov = obj->next;
  4. while(mov != NULL) {
  5. printf("%d ", mov->val);
  6. mov = mov->next;
  7. }
  8. printf("\n");
  9. }
  1. 主函数
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int main() {
  4. MyLinkedList* obj = myLinkedListCreate();
  5. printf("初始的四个结点:");
  6. int i;
  7. for(i = 2; i < 6; i++) {
  8. myLinkedListAddAtTail(obj, i * i);
  9. }
  10. showAll(obj);
  11. printf("首元结点前插入:");
  12. myLinkedListAddAtHead(obj, 1);
  13. showAll(obj);
  14. printf("尾元结点后插入:");
  15. myLinkedListAddAtTail(obj, 36);
  16. showAll(obj);
  17. printf("在指定坐标插入:");
  18. myLinkedListAddAtIndex(obj, 2, 6);
  19. showAll(obj);
  20. printf("在指定坐标删除:");
  21. myLinkedListDeleteAtIndex(obj, 3);
  22. showAll(obj);
  23. printf("获取指定坐标数值:%d\n", myLinkedListGet(obj, 3));
  24. myLinkedListFree(obj);
  25. }

运行结果

C语言实现单链表的基本操作 - 图1