当前位置:   article > 正文

c语言链表实现_c语言实现链表

c语言实现链表

1: c语言链表实现。

设计链表的实现。您可以选择使用单链表或双链表。

单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。


addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。


addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。


addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。


deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

2:

  1. typedef struct MyLinkedList_t {
  2. int val;
  3. struct MyLinkedList_t *next;
  4. } MyLinkedList;
  5. MyLinkedList* myLinkedListCreate() {
  6. MyLinkedList *obj = (MyLinkedList *)malloc(sizeof(MyLinkedList));
  7. obj->val = 0;
  8. obj->next = NULL;
  9. return obj;
  10. }
  1. //get(index):
  2. //获取链表中第 index 个节点的值。如果索引无效,则返回-1
  3. int myLinkedListGet(MyLinkedList* obj, int index) {
  4. if(index<0||obj->next==NULL){
  5. return -1;
  6. }
  7. int x=0;
  8. MyLinkedList *tmp=obj->next;
  9. while(x<index){
  10. if(tmp==NULL){
  11. return -1;
  12. }
  13. tmp=tmp->next;
  14. x++;
  15. }
  16. if(tmp!=NULL){
  17. return tmp->val;
  18. }
  19. return -1;
  20. }
  21. //addAtHead(val):
  22. //在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  23. void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
  24. MyLinkedList *node=(MyLinkedList*) malloc(sizeof(MyLinkedList));
  25. node->val=val;
  26. node->next=NULL;
  27. if(obj->next==NULL){
  28. obj->next=node;
  29. return;
  30. }
  31. else{
  32. node->next=obj->next;
  33. obj->next=node;
  34. }
  35. }
  36. void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
  37. MyLinkedList *node= (MyLinkedList*)malloc(sizeof(MyLinkedList));
  38. node->val=val;
  39. node->next=NULL;
  40. MyLinkedList*tmp=obj;
  41. while(tmp->next!=NULL){
  42. tmp=tmp->next;
  43. }
  44. tmp->next=node;
  45. }
  1. //addAtIndex(index,val):
  2. //在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  3. void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
  4. if(index<=0){
  5. myLinkedListAddAtHead(obj,val);
  6. return;
  7. }
  8. int x=0;
  9. MyLinkedList*tmp=obj;
  10. while(tmp->next!=NULL){
  11. if(x==index){
  12. break;
  13. }
  14. tmp=tmp->next;
  15. x++;
  16. }
  17. if(x!=index){
  18. return;
  19. }
  20. MyLinkedList*node=(MyLinkedList*)malloc(sizeof(MyLinkedList));
  21. node->val=val;
  22. node->next=tmp->next;
  23. tmp->next=node;
  24. }
  1. //deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
  2. //
  3. void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
  4. if (index < 0 || obj->next == NULL) {
  5. return;
  6. }
  7. if (index == 0) {
  8. obj->next = obj->next->next;
  9. return;
  10. }
  11. MyLinkedList *tmp = obj->next;
  12. int x = 0;
  13. while (tmp->next != NULL) {
  14. if (x == index - 1) {
  15. break;
  16. }
  17. tmp = tmp->next;
  18. x++;
  19. }
  20. if (x == index - 1 && tmp->next != NULL) {
  21. tmp->next = tmp->next->next;
  22. }
  23. }
  24. void myNodeFree(MyLinkedList* Node) {
  25. if (Node->next != NULL) {
  26. myNodeFree(Node->next);
  27. Node->next = NULL;
  28. }
  29. free(Node);
  30. }
  31. void myLinkedListFree(MyLinkedList* obj) {
  32. myNodeFree(obj);
  33. }
  34. 作者:onwaydbh
  35. 链接:https://leetcode.cn/problems/design-linked-list/solution/c-by-onwaydbh-fsyx/
  36. 来源:力扣(LeetCode)
  37. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/645939
推荐阅读
相关标签
  

闽ICP备14008679号