c单链表实现的栈结构

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

struct Node{
        int value;
        struct Node *next;
};
typedef struct Node LStackNode;
typedef struct Node *LinkedStack;
LinkedStack LinkedStackInit(LinkedStack s){
        s=NULL;
	return s;
}

LinkedStack LinkedPush(LinkedStack s,int x){
        LStackNode *n;
        n=(LStackNode *)malloc(sizeof(LStackNode));
	if(!n) exit(-1);
        n->value=x;
        if(s==NULL){
        s=n;
        }else{
        n->next=s;
        s=n;
        }
        return s;
}
LinkedStack LinkedPop(LinkedStack s){
        if(s==NULL) exit(0);
        int r=s->value;
        printf("%d \t",r);
        LStackNode *t;
        t=s;
        s=s->next;
	free(t);
        return s;
}

void printfLStack(LinkedStack t){
        int i;
        i=0;
        while(t!=NULL){
                t=LinkedPop(t);
        }
}

void main(){
        int n;
        int m;
        printf("please input the number: \n");
        scanf("%d",&n);
        srand(time(NULL));
        LinkedStack Seven,Sodd;
        Seven=LinkedStackInit(Seven);
        Sodd=LinkedStackInit(Sodd);
        int i=0;
        for(i;i<n;i++){
                m=rand()%100;
                printf("%d \t",m);
                if(m%2==0){
                  Seven=LinkedPush(Seven,m);
                }else{
                  Sodd=LinkedPush(Sodd,m);
                }
        }
        printf("\n Seven num:\n");
        printfLStack(Seven);
        printf("\n Sodd num:\n");
        printfLStack(Sodd);
        printf("\n");
}

指针实现篇

    #include <stdlib.h>  
    #include <stdio.h>  
    #include <time.h>  
      
    struct Node{  
            int value;  
            struct Node *next;  
    };  
    typedef struct Node LStackNode;  
    typedef struct Node *LinkedStack;  
    LinkedStackInit(LinkedStack *s){  
            *s=NULL;  
    }  
      
    void LinkedPush(LinkedStack *s,int x){  
            LStackNode *n;  
            n=(LStackNode *)malloc(sizeof(LStackNode));  
            if(!n) exit(-1);  
            n->value=x;  
            if(*s==NULL){  
            *s=n;  
            }else{  
            n->next=*s;  
            *s=n;  
            }  
    }  
    void LinkedPop(LinkedStack *s){  
            if(*s==NULL) exit(0);  
            int r=(**s).value;  
            printf("%d \t",r);  
            LStackNode *t;  
	    t=*s;
	    *s=(**s).next;
    	    free(t);   
    }  
      
    void printfLStack(LinkedStack * t){  
            int i;  
            while(*t!=NULL){  
	       LinkedPop(t);  
	    }  
    }  
      
    void main(){  
            int n;  
            int m;  
            printf("please input the number: \n");  
            scanf("%d",&n);  
            srand(time(NULL));  
            LinkedStack Seven,Sodd;  
            LinkedStackInit(&Seven);  
            LinkedStackInit(&Sodd);  
            int i=0;  
            for(i;i<n;i++){  
                    m=rand()%100;  
                    printf("%d \t",m);  
                    if(m%2==0){  
                      LinkedPush(&Seven,m);  
                    }else{  
                      LinkedPush(&Sodd,m);  
                    }  
            }  
            printf("\n Seven num:\n");  
            printfLStack(&Seven);  
            printf("\n Sodd num:\n");  
            printfLStack(&Sodd);  
            printf("\n");  
    }  

本文涉及的 结构体方面的知识可以参考

双链表实现单链表实现在多个方面存在区别,下面从结构、操作复杂度、空间复杂度等方面进行详细阐述: ### 结构差异 单链表的每个节点包含数据部分和指向下一个节点的指针,而双链表的每个节点除了数据部分和指向下一个节点的指针外,还包含指向前一个节点的指针。这使得双链表在结构上更加复杂,但也提供了更多的操作灵活性[^1]。 ### 操作复杂度 - **入操作**:在单链表和双链表实现时,入操作通常都是在链表头部插入新节点,时间复杂度均为 $O(1)$。以下是单链表和双链表入操作的代码示例: ```python # 单链表操作示例 class Node: def __init__(self, data): self.data = data self.next = None class SingleLinkedListStack: def __init__(self): self.head = None def push(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node # 双链表入操作示例 class DoublyNode: def __init__(self, data): self.data = data self.next = None self.prev = None class DoublyLinkedListStack: def __init__(self): self.head = None def push(self, data): new_node = DoublyNode(data) if self.head is not None: self.head.prev = new_node new_node.next = self.head self.head = new_node ``` - **出操作**:单链表和双链表实现的出操作都是删除链表头部节点,时间复杂度也均为 $O(1)$。不过,在单链表中删除头部节点时,只需要更新头指针;而在双链表中,除了更新头指针,还需要更新新的头节点的 `prev` 指针为 `None`。 ### 空间复杂度 从存储结构来看,每个双链表的节点要比单链表的节点多一个指针,长度为 $n$ 的双链表比单链表多占用 $n \times length$(在 32 位系统中,指针长度为 4 字节;在 64 位系统中,指针长度为 8 字节)的空间。因此,双链表实现的空间复杂度相对单链表会更高一些[^3]。 ### 灵活性 双链表由于每个节点有两个指针,在进行某些操作时比单链表更灵活。例如,如果需要在中查找某个元素并删除,双链表可以通过 `prev` 指针方便地找到前一个节点,而单链表则需要从头节点开始遍历,时间复杂度为 $O(n)$。 ### 应用场景 单链表实现由于结构简单、占用空间少,适用于对空间要求较高、操作相对简单的场景;而双链表实现则适用于需要频繁进行双向操作的场景,例如在的中间位置插入或删除元素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值