顺序建立链表(C语言)

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

//结构体
struct node
{
    int data;                  //数值域
    struct node *next;   //指针域
};
//建立链表
struct node *creat(int n)
{
    struct node *head,*tail,*p;   //头指针,尾指针,自由指针
    head=(struct node *)malloc(sizeof(struct node));
    tail=head;
    int i;
    for(i=1; i<=n; i++)
    {
        p=(struct node *)malloc(sizeof(struct node));
        scanf("%d",&p->data);
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
    return head;
}
//输出函数
void print(struct node *head)
{
    struct node *p;
    p=head->next;
    int m=0;
    while(p)
    {
        m++;
        if(m==1)printf("%d",p->data);
        else printf(" %d",p->data);
        p=p->next;
    }
}
//主函数
int main()
{
    int n;
    scanf("%d",&n);
    struct node *h;
    h=creat(n);
    print(h);
    return 0;
}

### 实现逆序建立链表 为了实现逆序建立链表,可以采用栈的思想或者直接在每次插入新节点时将其放置于头部位置。以下是基于C语言的具体实现方案。 #### 方法一:利用头插法构建单向链表 这种方法的核心是在读取数据的同时不断将新的结点添加到链表前端,从而自然形成反向排列的效果[^3]。 ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct ListNode { int data; struct ListNode* next; }; /// 创建并返回一个新的链表头指针 /// @return 链表的第一个有效节点地址 或者 当没有任何元素被加入时返回NULL struct ListNode* createListInReverseOrder() { struct ListNode *head = NULL, *p; while (scanf("%d", &(p->data)) != EOF && p->data != -1) { // 使用-1作为结束标志 p = (struct ListNode*) malloc(sizeof(struct ListNode)); // 将当前读入的数据存放到新建的节点中,并设置其指向下一个节点为空 p->next = head; head = p; // 更新头指针始终指向最新插入的那个节点 } return head; } ``` 此段代码通过循环接收用户输入直到遇到特定终止符(-1),期间每接收到一个数值就创建相应的新节点并将之置于现有列表最前方的位置上,最终得到的就是按照原始序列相反顺序组成的链表实例。 #### 方法二:借助辅助栈存储中间结果再依次弹出建表 如果希望先收集全部待处理项然后再一次性完成整个反转操作,则可考虑引入额外的空间——即栈来暂存这些项目,在所有数据都准备好之后再逐一取出用于构成目标链表: ```c #include <stdio.h> #include <stdlib.h> typedef struct StackNode { int value; struct StackNode* next; }StackNode; void push(StackNode **top_ref, int new_data); int pop(StackNode** top_ref); // ...省略push/pop定义... struct ListNode* buildReversedLinkedListUsingStack(int array[], size_t length){ StackNode* stackTop = NULL; for(size_t i=0;i<length;++i){ push(&stackTop,array[i]); } struct ListNode *listHead = NULL,*current; while(stackTop!=NULL){ current = (struct ListNode*)malloc(sizeof(*current)); current->data = pop(&stackTop); current->next=listHead; listHead=current; } return listHead; } ``` 这里先是把所有的整数压入堆栈之中,接着逐个从顶部移除它们以确保能够依照原先给定数组里各成员出现次序的倒叙来进行链接构造过程[^2]。 以上两种策略都能有效地达成题目所描述的任务需求,具体选用哪一种取决于实际应用场景和个人偏好等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值