诉称 发表于 2025-6-4 16:59:51

一个简单的C语言制作的单链表

C_LINK_LIST



[*]这是单链表和双链表的基本结果
点击查看代码//single_link_list
struct NODE
    int value;
    struct NODE * next;
}
```c
//double linked list
struct NODE{
    int value;
    struct NODE * previous;
    struct NODE * next;
}


这是自己制作的一个C语言单链表,他的功能包括创建一个单链表,查找删除特定的值,并且实现倒序单链表。
她的不足之处在于他无法在主函数中特定停止,等待用户进行输入。
This is my code.
```c
#include <stdlib.h>
#include <stdio.h>
#include "singly_linked_list.h"

//structNODE * sll_reverse(struct NODE * first);
int sll_remove(Node ** rootp, int value);
int dll_insert(Node ** rootp, int value);
Node * sll_reverse(Node *first);
int main(){
    int num;
    Node *first = (Node *)malloc(sizeof(Node));
    if(first == NULL){
      perror("NO Buffle: ");
      return 1;
    }
    first->value = 3;
    first->link = NULL;
    Node *rootp = first;
    while (scanf("%d" , &num) != EOF){
      dll_insert(&rootp, num);
    }
    Node * ptr = rootp;
    printf("\n");
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }
   /* getchar();getchar();
    printf("Input a single number you want to remove: ");
    getchar();
    while(scanf("%d", &num) != EOF){
      sll_remove(&rootp, num);
    }
    ptr = rootp;
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }*/
    rootp = sll_reverse(rootp);
    printf("\n");
    ptr = rootp;
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }
    ptr = rootp;
    while(ptr != NULL){
      Node * temp=ptr;
      ptr = ptr->link;
      free(temp);
    }
    return 0;
}

int dll_insert(Node ** rootp, int value){
    Node *previous = NULL;
    Node *current = *rootp;
    while(current != NULL && current->value < value){
      previous = current;
      current = current->link;
    }
    if (current != NULL && current-> value == value)
      return 0;

    Node *new = (Node *)malloc(sizeof(Node));
    if (new == NULL){
      perror("NO buffle : ");
      exit(EXIT_FAILURE);
    }
    new->value = value;
    new->link = current;
    if(previous != NULL){
      previous->link= new;
    }
    else{
      *rootp = new;
    }
    return 0;
}

int sll_remove(Node ** rootp,int value){
    Node *previous = NULL;
    Node *current = *rootp;
   
    while(current != NULL && current->value != value){
      previous = current;
      current = current->link;
    }
    if(current != NULL){
      Node * temp = current;
      current = current->link;
      free(temp);
      if(previous != NULL){
            return 0;
      }
      else {
            *rootp = current;
            return 0;
      }
    }
    else {
      printf("No this module. ");
      return 1;
    }
}
      

Node * sll_reverse(Node * first){
    int i = 0;
    Node *temp = first;
    while(temp != NULL){
      temp = temp->link;
      i++;
    }
    if( i == 0){
      printf("None Node.");
      return first;
    }
    Node *array;
    temp = first;
    for(int j = 0; j< i;j++){
      ar#include <stdlib.h>
#include <stdio.h>
#include "singly_linked_list.h"

//structNODE * sll_reverse(struct NODE * first);
int sll_remove(Node ** rootp, int value);
int dll_insert(Node ** rootp, int value);
Node * sll_reverse(Node *first);
int main(){
    int num;
    Node *first = (Node *)malloc(sizeof(Node));
    if(first == NULL){
      perror("NO Buffle: ");
      return 1;
    }
    first->value = 3;
    first->link = NULL;
    Node *rootp = first;
    while (scanf("%d" , &num) != EOF){
      dll_insert(&rootp, num);
    }
    Node * ptr = rootp;
    printf("\n");
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }
   /* getchar();getchar();
    printf("Input a single number you want to remove: ");
    getchar();
    while(scanf("%d", &num) != EOF){
      sll_remove(&rootp, num);
    }
    ptr = rootp;
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }*/
    rootp = sll_reverse(rootp);
    printf("\n");
    ptr = rootp;
    while(ptr != NULL){
      printf(" %d", ptr->value);
      ptr = ptr->link;
    }
    ptr = rootp;
    while(ptr != NULL){
      Node * temp=ptr;
      ptr = ptr->link;
      free(temp);
    }
    return 0;
}

int dll_insert(Node ** rootp, int value){
    Node *previous = NULL;
    Node *current = *rootp;
    while(current != NULL && current->value < value){
      previous = current;
      current = current->link;
    }
    if (current != NULL && current-> value == value)
      return 0;

    Node *new = (Node *)malloc(sizeof(Node));
    if (new == NULL){
      perror("NO buffle : ");
      exit(EXIT_FAILURE);
    }
    new->value = value;
    new->link = current;
    if(previous != NULL){
      previous->link= new;
    }
    else{
      *rootp = new;
    }
    return 0;
}

int sll_remove(Node ** rootp,int value){
    Node *previous = NULL;
    Node *current = *rootp;
   
    while(current != NULL && current->value != value){
      previous = current;
      current = current->link;
    }
    if(current != NULL){
      Node * temp = current;
      current = current->link;
      free(temp);
      if(previous != NULL){
            return 0;
      }
      else {
            *rootp = current;
            return 0;
      }
    }
    else {
      printf("No this module. ");
      return 1;
    }
}
      

Node * sll_reverse(Node * first){
    int i = 0;
    Node *temp = first;
    while(temp != NULL){
      temp = temp->link;
      i++;
    }
    if( i == 0){
      printf("None Node.");
      return first;
    }
    Node *array;
    temp = first;
    for(int j = 0; j< i;j++){
      array = temp;
      temp = temp->link;
    }
    Node *new =array;
    for(int k = i-1;k >= 0;k--){
      temp = array;
      if(k != 0){
            temp->link = array;
      }
      else{
            temp->link = NULL;
      }
    }
    return new;
}
ray = temp;
      temp = temp->link;
    }
    Node *new =array;
    for(int k = i-1;k >= 0;k--){
      temp = array;
      if(k != 0){
            temp->link = array;
      }
      else{
            temp->link = NULL;
      }
    }
    return new;
}头文件: single_link_list.h
typedef struct NODE {
    int value;
    struct NODE * link;
}Node;这是我制作的双链表
双链表与单链表的区别:单链表只能按某种顺序执行,而双链表在每个节点中都有前一个节点和后一个节点的指针,能够访问前一个节点和后一个节点。
这是我编写的双链表实现方式:
#include <stdio.h>
#include <stdlib.h>

typedef struct NODE {
    struct NODE * fwd;
    struct NODE * bwd;
    int value;
} Node;

Node * insert(Node *, int );
int main(){
    int new_value;
    Node * top;
    top = (Node *)malloc(sizeof(Node));
    if(top == NULL){
      perror("No memory: ");
      exit(EXIT_FAILURE);
    }
    top->bwd = NULL;
    top->fwd = NULL;
    printf("Hello linked list.\n");
    printf("Input some integet(-1 to quit). ");
    while((scanf("%d", &new_value) == 1) && new_value != -1){
      top=insert(top, new_value);
    }
    if(top->fwd == NULL){
      printf("NULL in top.\n");
      free(top);
      return 0;
    }
    for(Node * temp=top->fwd; temp != NULL; temp = temp->fwd){
      printf("%d ", temp->value);
    }
    //Node * current = top;
    Node * current = top->fwd;
    while(current != NULL){
      Node * temp = current;
      current = current->fwd;
      free(temp);
    }
    free(top);
    return 0;
}

Node * insert(Node * rootp, int value){
    Node * this;
    Node * next;
    Node * new;
   
    for (this = rootp; (next = this->fwd) != NULL ; this = next ){
      if(next->value == value)
            return rootp;
      if (this->value > value)
            break;
    }
    new = (Node *)malloc(sizeof(Node));
    if (new == NULL){
      perror("No memory: ");
      exit(EXIT_FAILURE);
    }
    new->value = value;
    if (next != NULL){
      new->fwd = next;
      if (this != rootp){
            this->fwd = new;
            new->bwd = this;
      }
      else{
            rootp->fwd = new;
            new->bwd = NULL;
      }
      next->bwd = new;
    }
    else{
      new->fwd = NULL;
      if(this != rootp){
            this->fwd = new;
            new->bwd = this;
      }
      else{
            rootp->fwd = new;
            new->bwd = NULL;
      }
      rootp->bwd = new;
    }
    return rootp;
}
2025-04-08 12:37:42 星期二

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 一个简单的C语言制作的单链表