带有头节点的链表操作

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(student)

typedef struct Student{
    int num;
    float score;
    struct Student *next;
}student;

student *find(student *head,int position){
    student *p=head;
    if(position<0)    return NULL;
    int i=0;
    while(p&&position!=i){
        p=p->next;
        i++;
    }
    return p;

student *create(student *head) {//动态创建带有头结点的链表 
    student *temp,*p; 
    head=malloc(LEN);
    p=head;
    head->next=NULL;
    do{
        temp=malloc(LEN);
        scanf("%d%f",&(temp->num),&(temp->score));
        temp->next=NULL;
        if(temp->num==0){
            return head;
        }
        p->next=temp;
        p=temp;
    }while(1);
}

void *del(student *head){//删除指定位置的节点 
    int position;
    int n=1,i;
    student *p,*p1; 
    printf("请输入要删除链表的位置:");
    scanf("%d",&position);
    if(head->next==NULL){
        printf("链表为空\n");
        return;
    }
    p=head->next;
    p1=head;
    i=position;
    while(i-1&&p->next!=NULL){
        p1=p;
        p=p->next;
        n++;
        i--;
    } 
    if(n==position)
        p1->next=p->next;
    else
        printf("位置输入有误\n");
}

void insert(student *head){//在输入的位置之后插入数据
    int position;
    student *p,*temp,*data; 
    data=malloc(LEN);
    printf("请输入插入的位置(输入0将插入1位置):");
    scanf("%d",&position);
    printf("请输入插入数据的信息(学号和成绩):");
    scanf("%d%f",&(data->num),&(data->score));
    p=find(head,position); 
    if(p==NULL)
        puts("输入位置有误");
    else{
        temp=p->next;
        p->next=data;
        data->next=temp->next;
    }
}

void print(student *head){ 
    student *p=head;
    if(head==NULL||head->next==NULL){
        printf("链表为空\n");
        return;
    }
    p=p->next;
    while(p!=NULL){
        printf("%-10d%-10.2f\n",p->num,p->score);
        p=p->next;
    }
}
int main(){
    student *head_a,*head_b;
    printf("请输入a链表的信息(学号和成绩,输入0 0结束):\n"); 
    head_a=create(head_a);
    print(head_a);
    del(head_a);
    print(head_a);
    insert(head_a);
    print(head_a);
    return 0;

### 回答1: 建立带有节点链表,可以使用以下步骤: 1. 定义链表节点的结构体,包含数据域和指向下一个节点的指针域。 2. 定义节点节点不存储任何数据,只是作为链表的起点,其指针域指向第一个节点。 3. 动态申请节点空间,将数据存储到节点中,将节点插入到链表中。 4. 遍历链表,访问节点数据。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct node { int data; struct node *next; } Node; int main() { // 定义节点 Node *head = (Node*)malloc(sizeof(Node)); head->next = NULL; // 插入节点 for (int i = 0; i < 5; i++) { Node *p = (Node*)malloc(sizeof(Node)); p->data = i; p->next = head->next; head->next = p; } // 遍历链表 Node *p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); // 释放节点空间 p = head; while (p != NULL) { Node *q = p->next; free(p); p = q; } return 0; } ``` 在该示例代码中,我们定义了一个 `Node` 结构体表示链表节点,其中 `data` 表示数据域,`next` 表示指针域。然后定义了节点 `head`,并将其指针域设置为 `NULL`。接下来,使用 `for` 循环向链表中插入 5 个节点,每个节点的数据域为 `i`,指向下一个节点的指针域为当前节点的指针域。最后遍历链表,输出每个节点的数据域。最后释放节点空间。 ### 回答2: 建立带有节点链表是一种常见的链表数据结构的实现方式。节点是位于链表首部的一个特殊节点,它不存储任何数据,只用于表示链表的起始位置。下面是一个简单的方法来建立带有节点链表: 1. 首先,我们需要定义链表节点的结构,通常包括两个部分:数据域和指针域。数据域用于存储节点的数据,指针域用于指向下一个节点。 2. 创建节点,使用一个特定值来初始化它的数据域,一般为空或者默认值。然后将指针域指向空。 3. 创建其他节点,按照需要依次添加到链表中。对于每个节点,先创建一个新的节点对象,然后将它的数据域填充为要存储的数据值。接下来,将指针域指向链表中的下一个节点。 4. 将最后一个节点的指针域指向空,表示链表结束。 通过上述步骤,我们就成功地建立了一个带有节点链表。可以通过遍历链表的方式,依次访问链表中的每个节点,并对节点中的数据进行操作带有节点链表相对于不带节点链表具有以下几个优点: 1. 可以处理空链表的情况,节点作为链表的起点可以防止链表为空时的异常情况。 2. 方便插入和删除操作节点的存在使得在链表的任意位置插入或删除节点时,不需要对链表是否为空进行额外判断。 3. 简化链表的遍历操作节点作为链表起始点,可以直接从节点开始遍历整个链表。 因此,在实际应用中,使用带有节点链表更为普遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值