2020-09-17

数据结构

1.创建一个结构体

创建一个包含自身结构的结构体,该结构体由一个数据域和一个指针域组成,数据域用来存储链表的数据,指针域则用来指向下一个结点。

typedef struct Node
{
   Elemtype data;
   struct Node* next;
 }Node
 typedef struct Node* Linklist;

2.链表初始化

在链表的初始化过程中要为一个结点用malloc函数分配一个空间,并且开始时Next指针指向一个NULL,然后返回链表(注意判断空间时候申请成功)

LinkList Init_List(void)
{  
   Node *L;
   L=(LinkList)malloc(sizeof(Node));//为根节点申请一个空间
   if(L==NULL)
   {
   printf("链表初始化失败");
   exit(-1);
   }
   L->next=NULL;
   return L;

3.单链表初始化插入

a.头插法创建单链表
即每次插入都在最开始的位置,后面的结点依次后移

void Creat_Link(Node *Link)
{
   int i,n,data;
   Node *Pnew;
   printf("请输入链表的长度:");
   scanf("%d",&n);
   while(n<0)
   {
     printf("输入的数据非法");
     printf("请重新输入链表长度");
     scanf("%d",&n);
    }
    for(i=0;i<n;i++)
    {
    printf("请输入插入的数据:");
    scanf("%d",&data);
    Pnew=(LinkList)malloc(sizeof(Node));
    if(NULL==Pnew)
    {
    printf("创建链表时内存分配失败");
    exit(-1);
    }
    Pnew->Data=data;
    Pnew->next=Link->next;
    Link->next=Pnew;
    }
    }

由于头插法每次都是插入到前面所以会导致单链表中的顺序与实际要插入的顺序相反

b.尾插法初始化单链表
尾插法建立链表,首先要定义两个指针节点,一个用于中间变量,一个用于将头节点和尾节点重合在一起,每次插入都从尾巴开始,所以插入进来的数据的结点始终指向NULL

void Creat_Link(Node *Link)
{
int i,n,data;
Node *pnew;
printf("请输入插入数据的长度:");
scanf("%d",&n);
while(n<=0)
{
printf("输入的数据的长度有问题,请重新输入");
scanf("%d",&n);
}
for(i=0;i<n;i++)
{
 printf("请输入数据:");
 scanf("%d",&data);
 pnew=(LinkList)malloc(sizeof(Node));
 if(pnew==null)
 {
 printf("内存分配失败");
 exit(-1);
 }
 pnew->Data=data;
 Link->next=pnew->next;
 Link=Pnew;//将Pnew给Link,相当于将Link往后移动
 }
Link->next=NULL;
}

4.单链表中间插入

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
   LinkList p=L;
   int j=0;
   while(p&&j<i-1)
   {
      p=p->next;
      ++j;
    }
    if(p==0||j>i-1)
    return ERROR;
    Linklist s;
    s=(Linklist)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
}

5.单链表删除第i个元素

Status ListDelete_L(LinkList &L,int i,ElemType $e)
{
   LinkList p;
   LinkList q;
   p=L;
   int j=0;
   while(p->next&&j<i-1)
   {
      p=p->next;
      ++j;
    }
    if((p->next)==null||j>i-1)
    return ERROR;
    q=p->next;
    p_next=q;
    e=q->data;
    free(q);//释放结点
    return OK;
 }

6.获取第i个元素的值

Status GetElem_L(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
  p=p->next;
  ++j;
}
 if(p==0||j>i)
 return ERROR;
 e=p->data;
 return OK;
 }

7.输出单链表的所有元素

void printLn(LinkList L)
{
LinkList p;
p=L->next;
while(p!=null)
{
printf("%d",p-next);
p=p->next;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值