链表基本操作API

1540阅读 0评论2015-09-15 九阳神功爱喝茶
分类:C/C++

自己写的链表的基本API,个人认为比较容易出错的地方是对链表的一些操作除了遍历之外,传入的都应该是指向头结点的指针的指针。

点击(此处)折叠或打开

  1. #pragma warning(disable:4996)
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. typedef int ElemType;
  5. typedef struct LinkNode {
  6.     ElemType data;
  7.     struct LinkNode *next;
  8. }LinkNode, *LinkList;
  9. //链表初始化
  10. void InitLinkedList(LinkList* list) {
  11.     *list = (LinkNode*)malloc(sizeof(struct LinkNode));
  12.     (*list)->next = NULL;
  13. }
  14. //链表在最后位置插入
  15. void Insert(LinkList *list, ElemType elem) {
  16.     LinkList l = (*list);
  17.     while (l->next != NULL) l = l->next;
  18.     LinkNode* node = (LinkNode*)malloc(sizeof(LinkNode));
  19.     node->data = elem;
  20.     node->next = NULL;
  21.     l->next = node;
  22. }
  23. //在链表的指定位置插入,i=1表示在第一个位置插入该值
  24. InsertLinkListAtPos(LinkList *list, int i, ElemType elem) {
  25.     LinkList l = *list;
  26.     while (--i) l = l->next;
  27.     LinkNode* node = (LinkNode*)malloc(sizeof(LinkNode));
  28.     node->data = elem;
  29.     node->next = NULL;
  30.     node->next = l->next;
  31.     l->next = node;

  32. }
  33. //删除指定位置i的链表值,并用elem返回
  34. DeleteLinkeListAtPos(LinkList *list, int i, ElemType* elem) {
  35.     LinkList l = *list;
  36.     while (--i) l = l->next;
  37.     LinkList p = l->next;
  38.     *elem = p->data;
  39.     l->next = l->next->next;
  40.     free(p);
  41. }
  42. //删除链表最后位置的元素
    void DeleteLastElem(LinkList *list) {
    LinkList l = (*list);
    while (l->next->next->next != NULL) l = l->next;
    l->next->next = l->next->next->next;
    }

  43. //链表的创建
  44. void CreateLinkList(LinkList *list) {
  45.     int data;
  46.     scanf("%d", &data);
  47.     if (data != 0)
  48.     {
  49.         LinkNode* node = (LinkNode*)malloc(sizeof(LinkNode));
  50.         node->data = data;
  51.         node->next = NULL;
  52.         (*list)->next = node;
  53.         CreateLinkList(&(*list)->next);
  54.     }
  55. }
  56. //遍历链表
  57. void Traversal(LinkList list){
  58.     while (list->next)
  59.     {
  60.         printf("%d ", list->next->data);
  61.         list = list->next;    
  62.     }
  63. }
  64. //逆序打印链表
  65. void InvertedLinkList(LinkList list) {
  66.     if (list->next) {
  67.         InvertedLinkList(list->next);
  68.     }
  69.     printf("%d\n",list->data);
  70. }
  71. int main() {
  72.     LinkList list;
  73.     //ElemType elem;
  74.     InitLinkedList(&list);
  75.     CreateLinkList(&list);
  76.     InsertLinkListAtPos(&list, 1, 3);
  77.     //DeleteLinkeListAtPos(&list,2,&elem );
  78.     //InvertedLinkList(list);
  79.     //printf("%d", elem);
  80.     Traversal(list);
  81.     
  82.     //Insert(&list, 5);
  83.     //printf("%d\n",list->next->data);
  84.     return 0;
  85. }

上一篇:棋盘覆盖问题
下一篇:字符串C语言常用API