数据结构

这篇博客介绍了线性表的两种实现方式——顺序表和静态链表,并提供了相关代码示例。接着,讨论了单向链表、循环链表和双链表的概念及操作,包括插入和删除节点的方法。内容深入浅出,适合初学者理解数据结构的基础知识。
摘要由CSDN通过智能技术生成

线性表

顺序表

typedef struct
{
    int a;
}test;
typedef struct test
{
    test *st;
    int length;
}sqList;
sqList sq;
void creat(int n)
{
    test *p;
    int i;
    p=sq.st=(test *)malloc(sizeof(test)*n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&p->a);
        p++;
    }
    sq.length=n;
}

静态链表

#include<stdio.h>
#define max 10000
typedef struct test
{
    int data;
    int cur;
}list;
void creat(list *a,int n);
int main()
{
    list a[max];
    int n;
    scanf("%d",&n);
    creat(a,n);
    for(int i=1;i<=n;i++)
    {
        printf("%d ",a[i].data);
    }
}
void creat(list *a,int n)
{
    int i;
    for(i=0;i<max-1;i++)
    {
        a[i].cur=i+1;
    }
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i].data);
    }
    a[0].cur=a[n].cur;//备注的下一个可用空间。
    a[max-1].cur=1;//可以用来得出第一个节点。
}

对于静态链表的删除和插入我们需要每次考虑到备用节点(空闲的节点)的位置,借助最后一个节点我们可以得到第一个节点的位置。
删除节点

k=max-1;//得到最后一个节点,以便得到第一个节点。
for(j=1;j<i-1;j++)//得到要处理位置的前面一个,特殊位置就是第一节点要被处理时也已经计算进去了。
{	
	k=a[j].cur;//移动位置;	
}
j=a[k].cur;
a[k].cur=a[j].cur;
free(a,j);//释放节点函数,自己写;

链式链表

单向链表

#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
    int data;
    struct list *next;
}List;
List *creat(int n);
int main()
{
    List *head,*p;
    int n;
    scanf("%d",&n);
    head=creat(n);
    p=head;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}
List *creat(int n)
{
    int i;
    List *p,*q,*head;
    q=(List *)malloc(sizeof(List));
    head=NULL;
    for(i=0;i<n;i++)
    {
        scanf("%d",&q->data);
        if(head==0)
        {
            p=head=q;
        }
        else
        {
            p->next=q;
            p=q;
        }
        q=(List *)malloc(sizeof(List));
    }
    p->next=0;//给最后一个节点赋值NULL代表结束。
    return head;
}

删除和插入节点,只需要找到处理节点之前的位置;
删除节点

q=p->nest;//q用来存储要删除的节点,p是删除节点的前面的节点。
p->next=p->next->next;
free(q);

插入节点

q->next=p->next;//q是要插入的节点,p是前面节点。
p->next=q;

循环链表
顾名思义就是一个环,与单链表不同的是判断结束是p!=head,我们也可以将头节点变为尾节点。

#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
    int data;
    struct list *next;
}List;
List *creat(int n);
int main()
{
    List *last,*p;
    int n;
    scanf("%d",&n);
    last=creat(n);
    p=last->next;
    do
    {
        printf("%d ",p->next->data);
        p=p->next;
    }while(p!=last);
}
List *creat(int n)
{
    int i;
    List *p,*q,*head;
    head=(List *)malloc(sizeof(List));
    head->next=NULL;
    for(i=0;i<n;i++)
    {
        q=(List *)malloc(sizeof(List));
        scanf("%d",&q->data);
        if(head->next==0)
        {
            q->next=head->next;
            head->next=q;
            p=q;
        }
        else
        {
            q->next=p->next;
            p->next=q;
            p=q;
        }

    }
    p->next=head;//给最后一个节点赋值head代表尾节点。
    return p;//返回尾节点
}

双链表
有两指针,一个指向前面节点Prior,一个指向后面节点next。
插入节点

q->prior=p;//q为插入的节点,p为前面节点。
q->next=p->next;
p->next->prior=q;
p->next=q;

删除节点

q=p->next;//p为前面节点
p->next=q->next;
q->next->prior=p;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值