实验四 单链表及其应用(参考程序)_实验四单链表

2020-02-28 其他范文 下载本文

实验四 单链表及其应用(参考程序)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验四单链表”。

实验四 单链表的建立

一、实验目的1.掌握线性表的链式存储结构——单链表的定义及C语言实现。2.掌握线性表在链式存储结构——单链表中的各种基本操作。

二、实验内容

1.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据分别按尾插入法和头插法来建立相应单链表。【知识要点】

为了便于实现各种运算,通常在单链表的第一个结点前增设一个附加结点,称为头结点,它的结构与表结点相同,其数据域可不存储信息,也可存储表长等附加信息,具体如下图。

【实验提示】

单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下:

typedef int datatype;

/* 线性表中存放整型元素 */ typedef struct LNode

/ * 结点类型定义 * /

{

datatype data;

/ * 数据域 * /

struct node *next;

/ * 指针域 * / }Linklist;

/* Linklist为单链表类型*/

注意结点的建立方法及构造新结点时指针的变化。构造一个结点需用到C语言的标准函数malloc(),如给指针变量p分配一个结点的地址:

p=(strcut LNode *)malloc(sizeof(Linklist));该语句的功能是申请分配一个类型为Linklist的结点的地址空间,并将首地址存入指针变量p中(或p=new(struct LNode);即生成新结点)。当结点不需要时可以用标准函数free(p)释放结点存储空间,这时p为空值(NULL)。【程序提示】

#include typedef struct LNode{

//补充实现表节点类型的定义; } Linklist;

Linklist * creatlist(){ int x;Linklist *head, *p;// head为单链表的头指针,p指向新建的结点

//补充实现单链表的建立;

return(head);

// 函数返回链表头指针head }

void output(Linklist *HeadL){ if(HeadL->next==NULL)printf(“空链表!n”);else { printf(“链表为:n”);Linklist *P;P=HeadL->next;while(P!=NULL){

printf(“%d->”,P->data);P=P->next;} printf(“n”);}

}

void main(void){ Linklist *List;List=creatlist();output(List);} 【参考程序】

1、尾插法

#include typedef struct LNode{ int data;struct LNode *next;} Linklist;

Linklist * creatlist(){ int x;

Linklist *head, *p,*r;/* head为头指针 */

head=new(struct LNode);

head->data=0;

/* 表头结点数据域赋值 */

r=head;

/* 尾指针的初值为头结点head */

printf(“请随机输入互不相同的正整数以0作为结束符:n”);

scanf(“%d”, &x);

/* 读入第一个结点的值 */

while(x!=0)

/* 输入数据,以0为结束符 */ { p=new(struct LNode);/* 生成新结点 */

p->data=x;

/* 给新结点的数据域赋值 */

r->next=p;

/* 新结点插入到表尾*rear之后 */

r=p;

/* 将尾指针rear指向新的尾结点 */

head->data++;

/* 链表长度计数 */

scanf(“%d”, &x);

/* 输入下一个结点的数据 */

}

r->next=NULL;

/* 将链表最后一个结点rear指针域置空 */

return(head);/* 函数返回链表头指针head */ }

void output(Linklist *HeadL){

if(HeadL->next==NULL)printf(“空链表!n”);else {

printf(“链表为:n”);

Linklist *P;

P=HeadL->next;

while(P!=NULL)

{

printf(“%d->”,P->data);

P=P->next;

}

printf(“n”);}

} void main(void){

Linklist *List;List=creatlist();output(List);}

2、头插法

#include typedef struct LNode{ int data;struct LNode *next;} Linklist;

Linklist * creatlist(){ int x;

Linklist *head, *p;/* head为头指针 */

head=new(struct LNode);

head->data=0;

/* 表头结点数据域赋值 */

head->next=NULL;

printf(“n请随机输入一组正整数以0结束输入:n”);

scanf(“%d”,&x);

/* 输入第一个结点数据值 */

while(x!=0)

/* 输入数据,以0为结束符 */

{ p=new(struct LNode);/* 生成新结点 */

p->data=x;/* 给新结点的数据域赋值 */

p->next=head->next;

/* 将新结点插入表头结点head之后 */

head->next=p;

head->data++;

/* 链表长度计数 */

scanf(“%d”,&x);

/* 输入下一个结点的值 */

}

return(head);/* 函数返回链表头指针head */ }

void output(Linklist *HeadL){

} void main(void){

Linklist *List;List=creatlist();output(List);}

方法二 void main(void){

} 2.在第一题的基础上,增加单链表的查找,插入,删除子程序。#include #include“stdlib.h”

typedef struct LNode{ int data;struct LNode *next;Linklist *head,*p;head=creatlist();printf(“output the list:n”);p=head->next;while(p){ } printf(“%d ”,p->data);p=p->next;} Linklist;

Linklist * creatlist(){ int x;

Linklist *head, *p;

/* head为头指针 */

head=new(struct LNode);

head->data=0;

/* 表头结点数据域赋值 */

head->next=NULL;

cout

cin>>x;/* 输入第一个结点数据值 */

while(x!=0)

/* 输入数据,以0为结束符 */

{ p=new(struct LNode);/* 生成新结点 */

p->data=x;/* 给新结点的数据域赋值 */

p->next=head->next;

/* 将新结点插入表头结点head之后 */

head->next=p;

head->data++;

/* 链表长度计数 */

cin>>x;

}

return(head);} void output(Linklist *HeadL){

if(HeadL->next==NULL)cout

cout

Linklist *P;

P=HeadL->next;

while(P!=NULL)

{

coutdata";/* 函数返回链表头指针head */ /* 输入下一个结点的值 */

P=P->next;

}

cout

Linklist *p;int j;

p=head->next;

j=1;

/* 从首结点开始扫描 */

while((p!=NULL)&&(j

{ p=p->next;

/* 扫描下一个结点 */

j++;

}

if(i==j)return(p);

else return(NULL);

/* 若找不到,则返回空指针 */ } Linklist *data_insert(Linklist *head, Linklist *p, int x){

Linklist *s;

s =new(struct LNode);/* 建立新结点 */

s->data=x;

/* 将x值赋给s→data */

/* 统计已扫描结点的个数 */

s->next=p->next;/* 新结点s后继指向原p结点后继 */

p->next=s;

/* p结点的后继指向新结点s */

return(head);

/* 返回带头结点的单链表头指针*/ } Linklist *key_delete(Linklist *head, int x){

Linklist *p, *q;

/* p是被删除结点,q是p的前驱结点 */

p=head;

while((p!=NULL)&&(p->data!=x))

{

q=p;

p=p->next;

}

if(p!=NULL)

{

q->next=p->next;

/* 修改p前驱结点q指针域 */

/* 释放结点空间 */

/* 若该结点存在,则删除之 */

free(p);

return(head);

}

/* 函数返回链表头指针*/

else

{

cout

return(NULL);

} }

void main(void){

Linklist *List,*chazhao;List=creatlist();output(List);chazhao=no_search(List,2);//查找第二个节点,并输出数据域信息 coutdata;List=data_insert(List,chazhao,50);//在第二个节点后插入数据为50的节点 cout

output(List);List=key_delete(List,50);//删除数据为50的节点 cout

output(List);}

《实验四 单链表及其应用(参考程序).docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
实验四 单链表及其应用(参考程序)
点击下载文档
相关专题 实验四单链表 及其应用 链表 程序 实验四单链表 及其应用 链表 程序
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文