您的位置:首页 > 理论基础 > 数据结构算法

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: