16 - 11 - 04 有头节点 单链表---《数据结构(c language)》

本文介绍了一种使用C语言实现线性表与单链表的方法,包括初始化、插入、删除等基本操作,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//设计应用举例
/*编程实现以下任务:建立一个线性表,依次输入数据0123456789、10、11、而后删除数据元素5,最后依次显示当前线性表中的数据元素,假设数据元素个数最大
不会超过100个*/
typedef struct{
    DateType list[MAXSIZE];
    int size;
}Seqlist;


//初始化
void ListInitiate(Seqlist *L)
{
    L->size = 0;
}


//求数据元素个数
int ListLength(Seqlist L)
{
    return L.size;
}


//插入数据元素,在顺序表L 的第 i 个位置 前 插入数据元素值x,
int ListInsert(L,i,x)
{
    DateType i;
    if(L->size >= MAXSIZE)
    {
        printf("ERROR !");
        return 0; 
    }
    else if(i<0 || i > L->size)
    {
       printf("ERROR !");
       return 0;
    }
    else
    {
    //从后向前依次后移,为插入做准备
        for(j = L->size ; j>i ; j--)
           L->list[j] = L->list[j-1];

        L->list[i] = x;  //插入x
        L->size++;
        return 1;

    }

//删除数据元素,删除顺序表L中位置i上的数据元素并保存到x中。
int ListDelete(Seqlist *L,int i,DateType *x)
{
//if else  bala bala的,不写了。。。
*x = L->list[i];  //保存删除的元素到x中
    for(j = i+1;j<= L->size-1;j++)
L->list[j-1] = L->list[j];
L->size--;
return 1;
}


//取出数据元素,取出顺序表L中第 i 个数据元素储存于 x 中
int ListGet(Seqlist L,int i,DateType *x)
{
*x = L.list[i];
return 1;

#include<stdio.h>
#define MAXSIZE 100
#typedef int DateType;
#include "Seqlist.h"
int main(void)
{
Seqlist mylist;
int i,x;stInitiate(&myst);
    for(i = 0; i < 10; i++)
        ListInsert(&mylist,i,i+1);
    ListDelete(&mylist,4,&x);
    for(i = 0;i< ListLength(mylist);i++)
    {
        ListGet(mylist,i,&x);
        printf("%d",x); 
    }
}
   带头节点的单链表一个实现
单链表的节点结构包括两个域:存储数据元素信息的数据域和存储直接后继位置的指针域.

定义:

typedef struct Node
{
DataType data;
struct Node *next
}SLNode;


//初始化//有空试试 *head
void ListInitiate(SLNode **head)
{
*head = (SLNode*)malloc(sizeof(SLNode));
(*head)->next = NULL;
}
/*在初始化操作前, 头指针参数 head 没有具体的地址,
在初始化操作时,指针参数head 才得到具体地址
而这个地址值要返回给调用函数。*/


//求当前数据元素个数
int ListLength(SLNode *head)
{
SLNode *p;
*p = head;
int size = 0;
while(p->next != NULL)
{
p = p->next;
size++;
} 
return size;
}
/*函数传进的是指针的地址,
所以形式参数是 *head,定义指向链表的
指针 p 令  *p = head,*/


//插入x到链表的第 i 个节点前。
int ListInsert(SLNode *head,int i,DataType x)
{
SLNode *p,*q;//或者 SLNode *p = head; 
p = head;
int j = -1;
while(p->next != NULL  &&  j<i-1 )
{//最终让指针 p 指向第 n-1 个节点。
p = p->next;
j++;
}
if(j!=i-1)
{
printf("ERROR");
return 0;
}

q = (SLNode*)malloc(sizeof(SLNode));
q->data = x;

q->next = p->next;
p->next = q;
return 1;
} 

“`
//删除第 i 个节点,被删的节点由 x 保存
int ListDelete(SLNode *head,int i,DataType *x)
{
SLNode *p,*s;
int j;
p = head;
j = -1;
while(p->next!=NULL&&p->next->next!= NULL&&j

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值