C++ 动态数据结构(五)

1.单链表的建立之尾插法

   从键盘读取一个数据赋值给 p 所指的结点,并使 p->next为空,即 p->next = NULL;

若原链表为空,则新建结点为头结点;

具体代码:

#include <malloc.h>
#include <stdio.h>
struct Link
{
int data;
struct Link *next;
};
/* 创建链表,当输入数据 data 为 0 时结束创建*/
struct Link   *createList(){ 
     struct Link    *head, *pr,*p;
     head = pr = NULL;
     p = (struct Link *)malloc(sizeof(struct Link));
     if ( p == NULL ) { 
printf("内存不足,程序结束\n");
}
     scanf( "%d",&p->data);
     p->next = NULL;
     while( p->data != 0 ){
            if( head == NULL ) { head = p;}
            else { pr->next = p; }
            pr = p;
            p = (struct Link *)malloc(sizeof(struct Link));
if (p==NULL) { 
printf("内存不足,程序结束\n");   
}
  scanf( "%d",&p->data);
p->next = NULL;
     }


     free( p );
     return head;
}
//输出链表
void PrintList(struct Link *head)
{
struct Link *p;
    int i=1;
p=head;
while(p!=NULL)
{
printf("%d%5d",i,p->data);
printf("\n");
p=p->next;
i++;
}
}
void main()
{
struct Link *head;
head=createList();
PrintList(head);

}


2.结点的删除

  从一个链表中删除一个结点,就是将待删除的结点从链表中分离出来,使其不再与链表的其他结点有任何相链关系,这一过程较为简单,只要改变结点间的链接关系即可。需要做的工作就是查找具有待删除结点性质的结点,找到后删除。

(1)如果链表为空,则无结点可以删除,此时要直接退出。

核心代码:

if(head == NULL)
{
printf(“链表为空表!\n”);
return    head;
}

(2)如果待删除结点是头结点,则需要将 head 指向该结点的下一个结点即可。

核心代码:

if( p == head )
head = p->next ;
free( p );

(3)如果待删除结点不是首结点,只需将前一结点的指针指向当前结点的下一结点即可。

核心代码:

         pr->next = p->next ;
free( p );

(4)如果已经搜索到链表的末尾,仍没有找到需要删除的结点。
应给出 “查找不到相应结点” 的提示信息。

具体代码:

#include <malloc.h>
#include <stdio.h>
struct Link
{
int data;
struct Link *next;
};
struct Link *DelNode( struct Link  *head, int   nodeData ){
struct Link  *p = head,  *pr = head;
if( head == NULL ) //链表为空表,没有结点
{ printf("链表为空表\n"); return head; }
while( nodeData != p->data && p->next !=NULL ){  
   pr = p;  p = p->next; //该循环查找数据为nodeData的结点
}
if( nodeData == p->data )//如果找到,则删除相应结点
{
if( p == head )    head = p->next; //结点为首结点,将head指向第2个结点
else   pr->next = p->next; //待删除结点不是首结点,则将前一结点指针指向下一结点
free( p );  //释放已删除的结点所占用的内存
}else
printf("没有找到需删除的信息\n");  
return   head; //返回头结点指针
}
//输出链表
void PrintList(struct Link *head)
{
struct Link *p;
    int i=1;
p=head;
while(p!=NULL)
{
printf("%d%5d",i,p->data);
printf("\n");
p=p->next;
i++;
}
}
void main()
{
    struct Link a={30},b={40},c={50};
struct Link *head;
int x=0,q=0;
a.next=&b;
b.next=&c;
c.next=NULL;
head=&a;
PrintList(head);
head=DelNode(head,40);
PrintList(head);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北顾丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值