C++ 动态数据结构(五)
2014-12-27 19:33
274 查看
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);
}
从键盘读取一个数据赋值给 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);
}
相关文章推荐
- C++ 动态数据结构(一)
- C++ 动态数据结构(三)
- c++代码之-------动态数据结构
- C++ 动态数据结构(二)
- C++ 动态数据结构(四)
- [FAQ] 数据结构用 C 和 C++ 描述有什么区别
- C#调用C++动态链接库中的函数指针与函数指针结构
- 打造 C++ 最灵活动态数组结构 (一)
- 打造 C++ 最灵活动态数组结构 (二)
- 再看C、C++、数据结构(二)
- 数据结构之顺序表C++实现
- C++数据结构——堆,二叉搜索树及Huffman编码输出
- 在SQL Server中动态修改数据表结构
- Flex 和C++ 之间传输结构体数据--用XML传输
- 数据结构与算法(C++)之一——顺序表(SeqList)
- 最近学习C++ 数据结构 尝试代码就放上来吧 初学者适用
- (摘)面向对象c++数据结构之基本数据结构-链表-使用链表管理器(连载中)
- 数据对象结构的动态建立与访问
- SQL Server数据对象结构的动态建立与访问
- 动态使用结构数据大小