链表基本操作

链表基本操作
链表基本操作

题目一链表基本操作

一、数据结构与核心算法的设计描述

1、单链表的最大长度

#define MAXSIZE 100

2、单链表的结点类型定义

/* 定义elemtype为int类型 */

typedef int elemtype;

/* 单链表的结点类型 */

typedef struct STD

{

elemtype elem;

STD *next;

}list, * linklist;

3、初始化单链表

/* 函数功能:对链表进行初始化。参数:链表(linklist L)。

成功初始化返回1,否则返回0 */

int init(linklist &L)

{

L=(linklist)malloc(sizeof(list));//头结点申请内存。

if(!L) //判断有无申请到空间。

return 0; //没有申请到内存,参数失败返回0

L->next=NULL;

L->elem=0; //单链表中有多少元素

return 1; //成功参数返回1

}

4、清空单链表

/* 函数功能:把链表清空。参数:链表(linklist L)。成功清空链表返回1*/

int makeempty(linklist &L)

{

linklist p,q;

p=L->next;

while(p) //当p非空时,删除p

{

q=p;

p=p->next;

free(q);

}

L->next=NULL; //只剩头指针,所以L->next=NULL

L->elem=0; //清空后链表中元素为0

return 1; //清空后返回1

}

5、求链表长度

/*函数功能:返回链表的长度。参数;链表(linklist L)。函数返回链表的长度 */ int getlength(linklist L)

{

linklist p;

p=L->next;

int j=0;

while(p)

{

j++; //统计链表中元素

p=p->next;

}

return j; //最后返回链表长度.

}

6、判断链表是否为空

/*函数功能:判断链表是否为空。参数;链表(linklist L)。链表为空时返回0,不为空返回1*/ int isempty(linklist L)

{

if(L->next) //头结点后有元素表示链表不空则返回1

return 1;

else

return 0; //头结点后没有元素表示链表不空则返回0

}

7、检查链表是否为满

/*函数功能:判断链表是否为满。参数;链表(linklist L)。链表为满时返回0,不为满返回1*/ int isfull(linklist L)

{

if(L->elem <= MAXSIZE) //头结点的elem储存的为链表的长度。

return 1; //其小于MAXSIZE表示链表不满

else

return 0; //否则返回0

}

8、遍历链表

/*函数功能:遍历链表,输出每个节点的elem值。参数;链表(linklist L) 通过循环逐个输出节点的elem值*/

void show(linklist L)

{

linklist p;

p=L->next;

if(isempty(L)==0) //当链表为空时则输出链表为空

{

cout<<"链表为空!";

}

while(p) //当链表为不空时则输出链表每个节点的elem值

{

cout<elem<<" ";

p=p->next;

}

cout<

}

9、从链表中查找元素

/*函数功能:从链表中查找有无给定元素。参数;链表(linklist L),给定元素(int i)

如果链表中有给定元素(i)则返回1,否则返回0*/

int find(linklist L, int i)

{

linklist p;

p=L->next;

while(p)

{

if(p->elem==i) //判断有无元素I,有返回1

return 1;

p=p->next;

}

return 0; //没有找到返回0

}

10、从链表中查找与给定元素值相同的元素在表中的位置

/*函数功能:从链表中查找给定元素的位置。参数;链表(linklist L),给定元素(int i) 如果链表中有给定元素i则返回元素的位置, 没有则返回0*/

int location(linklist L,int i)

{

linklist p;

int j=0;

p=L->next;

while(p)

{

j++;

if(p->elem==i) //判断有无元素i,有返回其的位置j

return j;

p=p->next;

}

return 0; //没有则返回0

}

11、向链表中插入元素

/*函数功能:向链表中的某个位置插入元素。参数;链表(linklist L),位置(int i),元素(elemtype e)。成功插入返回1,否则返回0 */

int insert(linklist &L, int i, elemtype e)

{

linklist p, s;

int j = 0;

p = L;

while (p&&j

{

p = p->next;

j ++;

}

if(j>i-1||!p) //不符合条件返回0

return 0;

s = (linklist)malloc(sizeof(list)); //给节点s分配内存

s->elem = e;

s->next = p->next; //插入操作

p->next = s;

L->elem++; //插入完成后头结点的elem加1

return 1; //成功插入返回1

}

12、从链表中删除元素

/*函数功能:在链表中的某个位置删除元素。参数;链表(linklist L),位置(int i),元素(elemtype e)。成功删除返回1,否则返回0 */

int deleteelem(linklist &L,int i)

{

linklist p,q;

int j=0;

p=L;

while (p->next&&j

{

p=p->next;

j++;

}

if(j>i-1||!(p->next)) //不符合条件返回0

return 0;

q=p->next;

p->next=q->next; //删除操作

free(q);

L->elem--; ////插入完成后头结点的elem减1

return 1; //成功删除返回1

}

13、主界面函数

/* 函数功能:显示所有操作功能。参数;无*/

void zhujiemian()

{

cout<

cout<<"\t\t\t\t数据结构实验一"<

cout<<"\t\t------------------------------------------"<

cout<<"\t\t 1 链表初始化"<

cout<<"\t\t 2 清空链表"<

cout<<"\t\t 3 求链表长度"<

cout<<"\t\t 4 链表是否为空"<

cout<<"\t\t 5 检查链表是否为满"<

cout<<"\t\t 6 遍历链表"<

cout<<"\t\t 7 从链表中查找元素"<

cout<<"\t\t 8 从链表中查找与给定元素值相同的元素在表中的位置"<

cout<<"\t\t 9 向链表中插入元素"<

cout<<"\t\t10 从链表中删除元素"<

cout<<"\t\t其他键退出"<

cout<<"\t\t------------------------------------------"<

cout<<"\t请选择要进行操作的序号(1--10):";

}

二、函数调用及主函数设计

主函数主要设计:

zhujiemian(); //显示主界面

cin>>a; //输入要进行的操作的序号

cout<

do

{

switch(a) //用switch语句进行选择操作

{

case 1: //初始化

if(init(L)==1)

cout<<"初始化成功!"<

else

cout<<"初始化失败!"<

break;

case 2:

if(makeempty(L)==1) //链表置空

cout<<"链表已清空!"<

else

cout<<"链表清空失败!"<

break;

case 3: //链表的长度

b=getlength(L);

cout<<"链表的长度为:"<

break;

case 4: //判断链表是否空

if(isempty(L)==1)

cout<<"链表不空!"<

else

cout<<"链表为空!"<

break;

case 5: //判断链表是否满

if(isfull(L)==1)

cout<<"链表不满!"<

else

cout<<"链表已满!"<

break;

case 6: //遍历链表

show(L);

break;

case 7: //链表是否有要查找元素

cout<<"您要查找的元素:";

cin>>b;

if(find(L,b)==1)

cout<<"链表中有元素"<

else

cout<<"链表没中有元素"<

break;

case 8: //输出链表要查找元素的位置

cout<<"您要查找的元素为:"<

cin>>b;

if(location(L,b)==0)

cout<<"没有您要查找的元素"<

else

cout<<"您查找的元素"<

break;

case 9:

do {

cout<<"输入你要插入的位置和元素"<

cin>>b>>c;

while (b<=0||b>getlength(L)+1)

/* 此处可以对错误的输入进行判断 */

{

cout<<"插入位置错误!请重新插入!"<

cin>>b>>c;

}

if(insert(L,b,c)==0)

cout<<"您插入的位置不对,插入失败!"<

else

cout<<"插入成功!"<

cout<<"是否继续插入元素(Y/y继续),其他键停止插入\n";//提示是否继续进行插入操作

cin>>YES;

} while(YES=='Y'||YES=='y');

break;

case 10:

do {

if(getlength(L)==0)

//判断链表是否为空若是则输出链表为空,并继续

{

cout<<"链表为空无法删除!"<

break;

}

cout<<"输入你要删除元素的位置:"<

cin>>b;

while(b<=0||b>getlength(L))

/* 此处可以对错误的输入进行判断 */

{

cout<<"输入错误!请重新输入!"<

cin>>b;

}

if(deleteelem(L,b)==0)

cout<<"您删除的位置不对,删除失败!"<

else

cout<<"删除成功!"<

cout<<"是否继续删除元素(Y/y继续),其他键停止删除\n";//提示是否继续进行删除操作

cin>>YES;

} while(YES=='Y'||YES=='y');

break;

default:

break;

}

system("pause");////按任意键继续

system("cls");////清理屏幕上的内容

zhujiemian();///显示主界面

cin>>a; //输入要进行操作的序号

cout<

}while(a>0&&a<=10);///对进行输入的数进行判断(不在0—9则程序结束)

说明:

通过调用序列号不同的函数进行各种操作。函数根据每次输入的数进行判断不在1—10内的函数将结束,否则将继续进行。

三、程序调试及运行结果分析

程序第一步必须执行初始化,否则程序不能运行。

在程序第一步必须执行初始化后,程序完美运行,在进行任何函数操作程序都是正常运行,而且本程序对插入和删除时进行错误检测如有的地方不可以插入,有点地方不能删除,如果链表为空时则程序会输出链表为空,并继续进行其他操作,大大减少了程序的bug。

四、实验总结

通过这次试验我熟悉了对链表的基本操作,对基本的链表操作有了很好的掌握,知道自己容易在什么地方出错。

五、程序清单

//实验一_1.h

#include "iostream"

#include "malloc.h"

#include "stdlib.h"

using namespace std;

#define MAXSIZE 100 //链表的最大长度

typedef int elemtype;

typedef struct STD

{

elemtype elem;

STD *next;

}list, * linklist;

void zhujiemian()

{

cout<

cout<<"【*******************数据结构实验一*******************】"<

cout<<"【****************************************************】"<

cout<<"【1 链表初始化】"<

cout<<"【2清空链表】"<

cout<<"【3求链表长度】"<

cout<<"【4链表是否为空】"<

cout<<"【5检查链表是否为满】"<

cout<<"【6遍历链表】"<

cout<<"【7从链表中查找元素】"<

cout<<"【8 从链表中查找与给定元素值相同的元素在表中的位置】"<

cout<<"【9向链表中插入元素】"<

cout<<"【10从链表中删除元素】"<

cout<<"【其他键退出】"<

cout<<【****************************************************】"<

cout<<"【*********请选择要进行操作的序号(1--10):***********】"<

}

int init(linklist &L)

{

L=(linklist)malloc(sizeof(list));

if(!L)

return 0;

L->next=NULL;

L->elem=0;

return 1;

}

int insert(linklist &L, int i, elemtype e)

{

linklist p, s;

int j = 0;

p = L;

while (p&&j

{

p = p->next;

j ++;

}

if(j>i-1||!p)

return 0;

s = (linklist)malloc(sizeof(list));

s->elem = e;

s->next = p->next;

p->next = s;

L->elem++;

return 1;

}

int deleteelem(linklist &L,int i)

{

linklist p,q;

int j=0;

p=L;

while (p->next&&j

{

p=p->next;

j++;

}

if(j>i-1||!(p->next))

return 0;

q=p->next;

p->next=q->next;

free(q);

L->elem--;

return 1;

}

int isempty(linklist L)

{

if(L->next)

return 1;

else

return 0;

}

void show(linklist L)

{

linklist p;

p=L->next;

if(isempty(L)==0)

{

cout<<"链表为空!";

}

while(p)

{

cout<elem<<" ";

p=p->next;

}

cout<

}

int getlength(linklist L) {

linklist p;

p=L->next;

int j=0;

while(p)

{

j++;

p=p->next;

}

return j;

}

int makeempty(linklist &L)

{

linklist p,q;

p=L->next;

while(p)

{

q=p;

p=p->next;

free(q);

}

L->next=NULL;

L->elem=0;

return 1;

}

int find(linklist L, int i) {

linklist p;

p=L->next;

while(p)

{

if(p->elem==i)

return 1;

p=p->next;

}

return 0;

}

int location(linklist L,int i) {

linklist p;

int j=0;

p=L->next;

while(p)

{

j++;

if(p->elem==i)

return j;

p=p->next;

}

return 0;

}

int isfull(linklist L)

{

if(L->elem <= MAXSIZE)

return 1;

else

return 0;

}

//main.cpp

#include "iostream"

#include "malloc.h"

#include "stdlib.h"

#include "实验一.h"

using namespace std;

int main()

{

char YES;

linklist L;

int a,b,c;

zhujiemian();

cin>>a;

cout<

do

{

switch(a)

{

case 1:

if(init(L)==1)

cout<<"初始化成功!"<

else

cout<<"初始化失败!"<

break;

case 2:

if(makeempty(L)==1)

cout<<"链表已清空!"<

else

cout<<"链表清空失败!"<

break;

case 3:

b=getlength(L);

cout<<"链表的长度为:"<

break;

case 4:

if(isempty(L)==1)

cout<<"链表不空!"<

else

cout<<"链表为空!"<

break;

case 5:

if(isfull(L)==1)

cout<<"链表不满!"<

else

cout<<"链表已满!"<

break;

case 6:

show(L);

break;

case 7:

cout<<"您要查找的元素:";

cin>>b;

if(find(L,b)==1)

cout<<"链表中有元素"<

else

cout<<"链表没中有元素"<

break;

case 8:

cout<<"您要查找的元素为:"<

cin>>b;

if(location(L,b)==0)

cout<<"没有您要查找的元素"<

else

cout<<"您查找的元素"<

break;

case 9:

do {

cout<<"输入你要插入的位置和元素"<

cin>>b>>c;

while (b<=0||b>getlength(L)+1)

{

cout<<"插入位置错误!请重新插入!"<

cin>>b>>c;

}

if(insert(L,b,c)==0)

cout<<"您插入的位置不对,插入失败!"<

else

cout<<"插入成功!"<

cout<<"是否继续插入元素(Y/y继续),其他键停止插入\n";

cin>>YES;

} while(YES=='Y'||YES=='y');

break;

case 10:

do {

if(getlength(L)==0)

{

cout<<"链表为空无法删除!"<

break;

}

cout<<"输入你要删除元素的位置:"<

cin>>b;

while(b<=0||b>getlength(L))

{

cout<<"输入错误!请重新输入!"<

cin>>b;

}

if(deleteelem(L,b)==0)

cout<<"您删除的位置不对,删除失败!"<

else

cout<<"删除成功!"<

cout<<"是否继续删除元素(Y/y继续),其他键停止删除\n";

cin>>YES;

} while(YES=='Y'||YES=='y');

break;

default:

break;

}

system("pause");

system("cls");

zhujiemian();

cin>>a;

cout<

}while(a>0&&a<=10);

return 0;

}

题目二约瑟夫环问题

一、循环链表的结点类型定义

/* 单链表的结点类型 */

typedef struct node

{

int number; /* 人的序号 */

int cipher; /* 密码 */

struct node *next; /* 指向下一个节点的指针 */

}List, *ListLink;

二、循环链表的初始化

/* 函数功能:初始化n个元素的循环链表。参数;链表(linklist L),元素个数(int n)通过后插法对无头结点的链表初始化。 */

void InitList(ListLink &L,int n)

{

int m,i;

cout<<"输入第1个人的密码:";

cin>>m;

L=new List;

L->number=1;

L->cipher=m;

L->next=L;

for(i=2;i<=n;i++)

{

ListLink lpp;

cout<<"输入第"<

cin>>m;

lpp=new List;

lpp->number=i;

lpp->cipher=m;

lpp->next=L->next;

L->next=lpp;

L=L->next;

}

cout<

L=L->next;

}

三、循环链表的长度

/* 函数功能:求循环链表的长度。参数;链表(linklist L) 通过各个扫描求循环链表长度 */

int ListLength(ListLink L)

{

ListLink lpp;

if(L==NULL)

{

cout<<"链表是空的.";

return 0;

}

int i=1;

lpp=L->next;

while(lpp!=L)

{

i++;

lpp=lpp->next;

}

return i;

}

四、显示循环链表

/*函数功能:循环链表的显示。参数;链表(linklist L) 。

通过各个扫描各个节点输出各个节点的密码 */

void ListTraverse(ListLink L)

{

ListLink lpp;

lpp=L;

int i=1;

cout<<"输入第1个人的密码:"<cipher<

lpp=lpp->next;

while(lpp!=L)

{

i++;

cout<<"输入第"<cipher<

lpp=lpp->next;

}

cout<

}

五、约瑟夫环实现

/*函数功能:实现所有人的出列次序。参数;链表(linklist L) ,密码(int m)。

每次要找到出列者的前驱,把出列者删除 */

void ListTraverse(ListLink L)

{

ListLink lpp;

lpp=L;

int i=1;

cout<<"输入第1个人的密码:"<cipher<

lpp=lpp->next;

while(lpp!=L)

{

i++;

cout<<"输入第"<cipher<

lpp=lpp->next;

}

cout<

}

int ListLength(ListLink L)

{

ListLink lpp;

if(L==NULL)

{

cout<<"链表是空的.";

return 0;

}

int i=1;

lpp=L->next;

while(lpp!=L)

{

i++;

lpp=lpp->next;

}

return i;

}

void shixian(ListLink &L,int m)

{

ListLink lpp=L;

ListLink l;

while(lpp->next!=L)

lpp=lpp->next;

for(int n=ListLength(L);n>0;n--)

{

cout<<"密码为:"<

cout<<"出列人的编号是:";

for(int i=1;i<=m%n-1;i++)

lpp=lpp->next;

cout<next->number<

m=lpp->next->cipher;

l=lpp->next;

lpp->next=l->next;

delete l;

}

}

函数调用及主函数设计:

int main()

{

int m,n;

ListLink L;

cout<<"输入人数(一个大于0小于30的数)和密码(一个大于0的数):"<

cin>>n>>m;

while(n<0||n>30||m<0)

{

cout<<"输入的数字不符合要求,请重新输入:"<

cin>>n>>m;

}

cout<<"请输入"<

InitList(L,n);

cout<

ListTraverse(L);

cout<

shixian(L,m);

return 0;

}

总结:

main函数先调用初始化循环链表的的函数void init(linklist &L,int n),然后将循环链表输出void show(linklist L),最后调用可以使人出列的函数void Joseph(linklist &L,int m)。

本程序可以很好地运行,具有一定的除错能力,输入数据时可以对其进行判断,减少程序出现bug的可能性。

通过对本实验的操作,我熟悉了循环链表的基本操作,而且对循环链表的基本操作有了很好的掌握。

程序清单

#include "iostream"

#include "stdlib.h"

using namespace std;

typedef struct node

{

int number; /* 人的序号*/

int cipher; /* 密码*/

struct node *next; /* 指向下一个节点的指针*/

}List, *ListLink;

void InitList(ListLink &L,int n)

{

int m,i;

cout<<"输入第1个人的密码:";

cin>>m;

L=new List;

L->number=1;

L->cipher=m;

L->next=L;

for(i=2;i<=n;i++)

{

ListLink lpp;

cout<<"输入第"<

cin>>m;

lpp=new List;

lpp->number=i;

lpp->cipher=m;

lpp->next=L->next;

L->next=lpp;

L=L->next;

}

cout<

L=L->next;

}

void ListTraverse(ListLink L)

{

ListLink lpp;

lpp=L;

int i=1;

cout<<"输入第1个人的密码:"<cipher<

lpp=lpp->next;

while(lpp!=L)

{

i++;

cout<<"输入第"<cipher<

lpp=lpp->next;

}

cout<

}

int ListLength(ListLink L)

{

ListLink lpp;

if(L==NULL)

{

cout<<"链表是空的.";

return 0;

}

int i=1;

lpp=L->next;

while(lpp!=L)

{

i++;

lpp=lpp->next;

}

return i;

}

void shixian(ListLink &L,int m)

{

ListLink lpp=L;

ListLink l;

while(lpp->next!=L)

lpp=lpp->next;

for(int n=ListLength(L);n>0;n--)

{

cout<<"密码为:"<

cout<<"出列人的编号是:";

for(int i=1;i<=m%n-1;i++)

lpp=lpp->next;

cout<next->number<

m=lpp->next->cipher;

l=lpp->next;

lpp->next=l->next;

delete l;

}

}

int main()

{

int m,n;

ListLink L;

cout<<"输入人数(一个大于0小于30的数)和密码(一个大于0的数):"<

cin>>n>>m;

while(n<0||n>30||m<0)

{

cout<<"输入的数字不符合要求,请重新输入:"<

cin>>n>>m;

}

cout<<"请输入"<

InitList(L,n);

cout<

ListTraverse(L);

cout<

shixian(L,m);

return 0;

}

实验二 链表操作实现

实验二链表操作实现 实验日期: 2017 年 3 月 16 日 实验目的及要求 1. 熟练掌握线性表的基本操作在链式存储上的实现; 2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3. 掌握线性表的链式存储结构的定义和基本操作的实现; 4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。 实验容 已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。 (1)链表类型定义 typedef struct { int xh; /*学号*/ float sg; /*身高*/ int sex; /*性别,0为男生,1为女生*/ } datatype; typedef struct node{ datatype data; /*数据域*/ struct node *next; /*指针域*/ } LinkNode, *LinkList; (2)带头结点的单链表的基本运算函数原型 LinkList initList();/*置一个空表(带头结点)*/ void createList_1(LinkList head);/*创建单链表*/ void createList_2(LinkList head);/* 创建单链表*/ void sort_xh(LinkList head);/*单链表排序*/ void reverse(LinkList head);/*对单链表进行结点倒置*/ void Error(char *s);/*自定义错误处理函数*/ void pntList(LinkList head);/*打印单链表*/ void save(LinkList head,char strname[]);/*保存单链表到文件*/

数据结构 单链表基本操作代码

实验一单链表 #include "stdio.h" #include "stdlib.h" typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void creatLNode(LinkList &head) { int i,n; LNode *p; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL; printf("请输入链表的元素个数:"); scanf("%d",&n); for(i=n;i>0;i--) { p=(LNode*)malloc(sizeof(LNode)); printf("第%d个元素:",i); scanf("%d",&p->data); p->next=head->next; head->next=p; } } void InsertLNode(LinkList &L) { LNode *p=L; int i,j=0,e; printf("请输入你要插入的位置(超过链表长度的默认插在最后!):"); scanf("%d",&i); printf("请输入你要插入的元素:"); scanf("%d",&e); while (p->next&&jnext; ++j; }

LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } int DeleteLNode(LinkList &L,int i,int &e) { LNode *p; p=L; LNode *q; int j=0; while (p->next&&jnext; ++j; } if(!(p->next)||j>i-1) { printf("删除位置不合理!\n"); return 0; } q=p->next; p->next=q->next; e=q->data; free(q); return e; } void DeleteCF(LinkList &L) { LNode *p,*s,*r; p=L->next; while(p!=NULL) { r=p; s=r->next; while(s!=NULL) { if(p->data==s->data) { r->next=s->next; s=s->next;

实验三四 链表的实现和应用

江南大学物联网工程学院上机报告
课程名称 班 级 数据结构 上机名称 姓 名 链表的实现和应 用 上机日期 学 号 2016.3.11 上机报告要求 1.上机名称 2.上机要求 3.上机环境 4.程序清单(写明运行结果) 5.上机体会
1.上机名称
链表的实现和应用
2.上机要求
⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表 L1和 L2分别代表集合 A 和 B,试设计算法求 A 和 B 的并集 C,并用线 性表 L3代表集合 C;②设线性表 L1和 L2中的数据元素为整数,且均已按值非递减有序排列,试 设计算法对 L1和 L2进行合并,用线性表 L3保存合并结果,要求 L3中的数据元素也按值非递减 有序排列。 ⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式 相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。
3.上机环境
Visual C++ 6.0
4.程序清单(写明运行结果)
(1) #include #include typedef int datatype; typedef struct node { datatype data; struct node *next; }LinkList; LinkList *CREATLISTF(LinkList *L,int n) { intnum,i; LinkList *head,*s,*r; head=L; r=head; head->next=NULL;

单链表的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:单链表建立及操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号

一、实验目的: (1)动态地建立单链表; (2)掌握线性表的基本操作:求长度、插入、删除、查找在链式存储结构上的实现; (3)熟悉单链表的应用,明确单链表和顺序表的不同。 二、实验环境: Windows 8.1 Microsoft Visual c++ 6.0 三、实验内容及要求: 建立单链表,实现如下功能: 1、建立单链表并输出(头插法建立单链表); 2、求表长; 3、按位置查找 4、按值查找结点; 5、后插结点; 6、前插结点 7、删除结点; 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个单链表。 2、编写实现相关功能函数,完成子函数模块。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。

五、代码: #include #include typedef char datatype; typedef struct node { datatype data; struct node *next; }linklist; linklist *head,*p; //头插法建立单链表 linklist *Creatlistf() { char ch; linklist *head,*s; head=NULL; ch=getchar(); printf("请输入顺序表元素(数据以$结束):\n"); while(ch!='$') { s=(linklist *)malloc(sizeof(linklist)); s->data=ch; s->next=head; head=s; ch=getchar(); } return head; } //求单链表的长度 void get_length(struct node *head) { struct node *p=head->next; int length=0;

单链表的基本操作 C语言课程设计

课程设计(论文) 题目名称单链表的基本操作 课程名称C语言程序课程设计 学生姓名 学号 系、专业信息工程系、网络工程专业 指导教师成娅辉 2013年6月6 日

目录 1 前言 (3) 2 需求分析 (3) 2.1 课程设计目的 (3) 2.2 课程设计任务 (3) 2.3 设计环境 (3) 2.4 开发语言 (3) 3 分析和设计 (3) 3.1 模块设计 (3) 3.2 系统流程图 (4) 3.3 主要模块的流程图 (6) 4 具体代码实现 (9) 5 课程设计总结 (12) 5.1 程序运行结果 (12) 5.2 课程设计体会 (12) 参考文献 (13) 致谢 (13)

1 前言 我们这学期学习了开关语句,循环语句、链表、函数体、指针等的应用,我们在完成课程设计任务时就主要用到这些知识点,本课题是单链表的简单操作,定义四个子函数分别用来创建链表、输出链表、插入数据以及删除数据,主函数中主要用到开关语句来进行选择调用哪个子函数,下面就是课程设计的主要内容。 2 需求分析 2.1 课程设计目的 学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。 2.2 课程设计任务 输入一组正整数,以-1标志结束,用函数实现:(1)将这些正整数作为链表结点的data域建立一个非递减有序的单链表,并输出该单链表;(2)往该链表中插入一个正整数,使其仍保持非递减有序,输出插入操作后的单链表;(3)删除链表中第i个结点,输出删除操作后的单链表,i从键盘输入。 2.3 设计环境 (1)WINDOWS 7系统 (2)Visual C++ 2.4 开发语言 C语言 3 分析和设计 3.1 模块设计 定义链表结点类型struct node表示结点中的信息,信息包括数据域data(用于存放结点中的有用数据)以及指针域next(用于存放下一个结点的地址),并将链表结点类型名改为NODE。如下所示:

双向链表基本操作

双向链表 输入一个双向链表,显示些双向链表并对此双向链表排序运行结果: 源程序: #include #include #include

typedef struct Link/*双向链表结构体*/ { int data; struct Link *lift; struct Link *right; }linkx,*linky; linky Init();/*建立双向链表*/ void PrLink(linky p);/*输出双向链表*/ linky Sort(linky head);/*对双向链表排序*/ linky Swap(linky head,linky one,linky two);/*任意交换双向链表两个结点的地址*/ void main(void) { linky head; head=Init(); head=Sort(head); PrLink(head); } linky (Init())/*建立链表*/ { linky p,q,head; int n=0; head=p=q=(linky)malloc(sizeof(linkx)); printf("排序前的链表: "); scanf("%d",&p->data);/*输入数据*/ head->lift=NULL; n++; while(n!=10)/*一直输入到规定的数字个数停止*/ { q=p;

p=(linky)malloc(sizeof(linkx)); scanf("%d",&p->data);/*输入数据*/ q->right=p; p->lift=q; n++; } p->right=NULL; return(head); } linky Swap(linky head,linky one,linky two)/*任意交换两个结点*/ {linky temp; if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交换*/ { if(one->right==two)/*只有两个结点的情况下*/ { two->right=one; two->lift=NULL; one->lift=two; one->right=NULL; head=two; } else/*有间隔的首尾交换*/ { one->right->lift=two; two->lift->right=one; two->right=one->right; one->lift=two->lift; two->lift=one->right=NULL; head=two;/*尾结点成为头结点*/ }

单链表的建立及其基本操作的实现(完整程序)

#include "stdio.h"/*单链表方式的实现*/ #include "malloc.h" typedef char ElemType ; typedef struct LNode/*定义链表结点类型*/ { ElemType data ; struct LNode *next; }LNode,*LinkList;/*注意与前面定义方式的异同*/ /*建立链表,输入元素,头插法建立带头结点的单链表(逆序),输入0结束*/ LinkList CreateList_L(LinkList head) { ElemType temp; LinkList p; printf("请输入结点值(输入0结束)"); fflush(stdin); scanf("%c",&temp); while(temp!='0') { if(('A'<=temp&&temp<='Z')||('a'<=temp&&temp<='z')) { p=(LinkList)malloc(sizeof(LNode));/*生成新的结点*/ p->data=temp; p->next=head->next; head->next=p;/*在链表头部插入结点,即头插法*/ } printf("请输入结点值(输入0结束):"); fflush(stdin); scanf("%c",&temp); } return head; } /*顺序输出链表的内容*/ void ListPint_L(LinkList head) { LinkList p; int i=0; p=head->next; while(p!=NULL) { i++; printf("单链表第%d个元素是:",i);

链表的基本操作(基于C)

#include #include struct Student { char cName[20]; int iNumber; struct Student* pNext; }; int iCount; struct Student* Create() { struct Student* pHead=NULL; struct Student* pEnd,*pNew; iCount=0; pEnd=pNew=(struct Student*)malloc(sizeof(struct Student)); printf("please first enter Name ,then Number\n"); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); while(pNew->iNumber!=0) { iCount++; if(iCount==1) { pNew->pNext=pHead; pEnd=pNew; pHead=pNew; } else { pNew->pNext=NULL; pEnd->pNext=pNew; pEnd=pNew; } pNew=(struct Student*)malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); } free(pNew); return pHead; }

void Print(struct Student* pHead) { struct Student *pTemp; int iIndex=1; printf("----the List has %d members:----\n",iCount); printf("\n"); pTemp=pHead; while(pTemp!=NULL) { printf("the NO%d member is:\n",iIndex); printf("the name is: %s\n",pTemp->cName); printf("the number is: %d\n",pTemp->iNumber); printf("\n"); pTemp=pTemp->pNext; iIndex++; } } struct Student* Insert(struct Student* pHead) { struct Student* pNew; printf("----Insert member at first----\n"); pNew=(struct Student*)malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); pNew->pNext=pHead; pHead=pNew; iCount++; return pHead; } void Delete(struct Student* pHead,int iIndex) { int i; struct Student* pTemp; struct Student* pPre; pTemp=pHead; pPre=pTemp; printf("----delete NO%d member----\n",iIndex); for(i=1;i

链表的基本操作-数据结构实验报告

大学数据结构实验报告 课程名称数据结构实验第(四)次实验实验名称链表的基本操作 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年10月01日 一、实验目的 1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La (2)在La中插入一个新结点 (3)删除La中的某一个结点 (4)在La中查找某结点并返回其位置 (5)打印输出La中的结点元素值 (6)清空链表 (7)销毁链表 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 四、思考与提高: 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?五、实验设计 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La LinkList InitList() {

int i,value,n; LinkList H=(LinkList)malloc(sizeof(LNode)); LinkList P=H; P->next=NULL; do{ printf("请输入链表的长度:"); scanf("%d",&n); if(n<=0) printf("输入有误请重新输入!\n"); }while(n<=0); printf("请输入各个元素:\n"); for(i=0; idata=value; P->next=NEW; NEW->next=NULL; P=NEW; } printf("链表建立成功!\n"); return H->next; } (2)在La中插入一个新结点 LinkList InsertList(LinkList L,int i,ElemType value) { LinkList h,q,t=NewLNode(t,value); int x=0; h=q=L; if(i==1) t->next=h, h=t; else { while(x++next; t->next=q->next; q->next=t; } printf("插入成功!\n"); return h; } (3)删除La中的某一个结点

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1. 定义单链表的结点类型。 2. 熟悉对单链表的一些基本操作和具体的函数定义。 3. 通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、 算法分析与设计。 头结点 ......

2.单链表插入 s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程序做了仔细的分析,对单链表创建、插入、删除算法画了详细的N-S流程图。

单链表基本操作实验

实验2 链表的操作 实验容: 1)基础题:编写链表基本操作函数,链表带有头结点 (1)CreatList_h()//用头插法建立链表 (2)CreateList_t()//用尾插法建立链表 (3)InsertList()向链表的指定位置插入元素 (4)DeleteList()删除链表中指定元素值 (5)FindList()查找链表中的元素 (6)OutputList()输出链表中元素 2)提高题: (1)将一个头节点指针为heada的单链表A分解成两个单链表A和B,其头结点指针分别为heada和headb,使得A表中含有原单链表A中序号为奇数的元素,B表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。 (2)将一个单链表就地逆置。 即原表(a1,a2,。。。。。。 an),逆置后新表(an,an-1,。。。。。。。a1) /* 程序功能 :单链表基本功能操作 编程者 :天啸 日期 :2016-04-14 版本号 :3.0 */ #include #include typedef struct List { int data; struct List *next; }List; void CreatList_h(List *L) //头插法 { int i = 0; int n = 0; int goal; List *p; printf("请输入数据的个数:\n"); scanf("%d",&n); L -> next = NULL; for(i=0;i

{ printf("请输入第%d个数:\n",i+1); scanf("%d",&goal); p = (struct List*)malloc(sizeof(struct List)); p -> data = goal; p -> next = L->next; //将L指向的地址赋值给p; L -> next = p; } } void CreateList_t(List *L) //尾插法 { int i; int n; int goal; List *p; List *q=L; printf("请输入数据的个数:\n"); scanf("%d",&n); for (i=0;i data = goal; q -> next = p; q = p; } q -> next = NULL; } void InsList(List *L,int i,int e) //插入 { List *s; List *p = L; int j = 0; while (p&&jnext; ++j; } s = (struct List*)malloc(sizeof(struct List)); s -> data = e; //插入L中

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1.定义单链表的结点类型。 2.熟悉对单链表的一些基本操作和具体的函数定义。 3.通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、算法分析与设计。 1.创建单链表: 头结点L

...... 2.单链表插入

s s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程

链表的基本操作

2.链表的基本操作 对链表施行的操作有很多种,最基本的操作是在链表中插入结点、在链表中删除结点、在链表中查找结点等。 (1) 链表结点的插入 ①在空链表中插入一个结点 空链表就是头指针为空的链表。 a)用如下语句申请一个new结点: new=(struct node)calloc(1,sizeof(struct node)); b)为new结点填充数据:将要存储的数据对应传递给new结点数据域的各个成员。 c)修改有关指针的指向:将new的next成员置空,使new结点成为链表的最后一个结点;将head指向new结点。 ②在链表的结点之后插入一个结点 要在链表head的C、D结点之间出入一个new结点,就是将new结点变成C结点的下一个结点,而new结点的下一个结点为D结点. 操作过程为: a) 使new的指针域存储结点D的首地址。 b) 使C结点的指针域存储结点new的地址。 例2 建立学生成绩链表,链表有3个结点。 #include #define N 3 struct s_node { char num[4]; int score;

struct s_node *next; }; main() { struct s_node *creat_node(void); /*生成链表结点的函数*/ struct s_node *creat_list(int n); /*建立链表的函数*/ void out_list(struct s_node *head); /*输出链表函数*/ struct s_node *head=NULL; head=creat_list(N); out_list(head); } struct s_node *creat_node(void) /*生成链表结点的函数*/ { struct s_node *p; int score; fflush(stdin); p=(struct s_node *)calloc(1,sizeof(struct s_node)); gets(p->num); scanf("%d",&score); p->score=score; p->next=NULL; return(p);

链表基本操作实验报告记录

链表基本操作实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

实验2链表基本操作实验 一、实验目的 1.定义单链表的结点类型。 2.熟悉对单链表的一些基本操作和具体的函数定义。 3.通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、算法分析与设计。 1.创建单链表: LinkedList LinkedListCreat( ) 创建链表函数 LinkedList L=LinkedListInit(),p, r; 调用初始化链表函数 r=L; r指向头结点 使用malloc函数动态分配存储空间,指针p指向新开辟的结点,并将元素存 放到新开辟结点的数据域, p=(LinkedList)malloc(sizeof(LNode)); p->data=x; r->next=p; 将新的结点链接到头结点r之后 r=p; r指向p结点 scanf("%d",&x); 满足条件循环输入链表元素 while(x!=flag) 当输入不为-1时循环 r->next=NULL; return L; 将链表结尾赋空值,返回头结点L 头结点L L ...... ^ ^ An A1 A2

《数据结构》实验报告模板附实例实验一线性表的基本操作实现.doc

实验一线性表的基本操作实现及其应用 一、实验目的 1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。 2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。 二、实验内容 √1、单链表的表示与操作实现( * ) 2、约瑟夫环问题 3、Dr.Kong的艺术品 三、实验要求 1、按照数据结构实验任务书,提前做好实验预习与准备工作。 2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。 3、严格按照数据结构实验报告模板和规范,及时完成实验报告。 四、实验步骤 (说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码) ㈠、数据结构与核心算法的设计描述 (程序中每个模块或函数应加注释,说明函数功能、入口及出口参数) 1、单链表的结点类型定义 /* 定义DataType为int类型*/ typedef int DataType; /* 单链表的结点类型*/ typedef struct LNode { DataType data; struct LNode *next; }LNode,*LinkedList; 2、初始化单链表 LinkedList LinkedListInit( )

{ // 每个模块或函数应加注释,说明函数功能、入口及出口参数} 3、清空单链表 void LinkedListClear(LinkedList L) {// 每个模块或函数应加注释,说明函数功能、入口及出口参数} 4、检查单链表是否为空 int LinkedListEmpty(LinkedList L) { …. } 5、遍历单链表 void LinkedListTraverse(LinkedList L) { …. } 6、求单链表的长度 int LinkedListLength(LinkedList L) { ….} 7、从单链表表中查找元素 LinkedList LinkedListGet(LinkedList L,int i) { //L是带头结点的链表的头指针,返回第i 个元素} 8、从单链表表中查找与给定元素值相同的元素在链表中的位置 LinkedList LinkedListLocate(LinkedList L, DataType x) { ……} 9、向单链表中插入元素 void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法 // 在链表中第i 个结点之前插入新的元素x } 10、从单链表中删除元素 void LinkedListDel(LinkedList L,DataType x) { // 删除以L 为头指针的单链表中第i 个结点} 11、用尾插法建立单链表 LinkedList LinkedListCreat( ) { ……}

单链表的定义及其基本操作技巧

单链表的定义及基本操作 一、实验目的、意义 (1)理解线性表中带头结点单链表的定义和逻辑图表示方法。 (2)熟练掌握单链表的插入,删除和查询算法的设计与实现。 (3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。 二、实验内容及要求 说明1:本次实验中的链表结构均为带头结点的单链表。 说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求: 建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。 三、实验所涉及的知识点 数据结构、C语言语法函数、结构体类型指针、单链表(建表、初始化链表、求表长、插入、删除、查询算法)等。 四、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

五、总结与体会 (调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。) 调试程序时,出现了许多错误。如:结构体类型指针出错,忽略了释放存储空间,对头插法建表、尾插法建表不熟悉等。另外还有一些语法上的错误。由于对所学知识点概念模糊,试验课上未能完成此次上机作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。以后要都去练习、实践,以完善自己的不足。 六、程序清单(包含注释) //单链表

数据结构上机报告:编写一个程序,实现单链表的各种基本运算

《数据结构》上机报告 _2011_年_ 3 _月_ 9 _日姓名_____ 学号_ _ 同组成员 __ _无_ __ 1.实验题目及要求 编写一个程序,实现单链表的各种基本运算 2.需求分析 建立一个单链表,实现单链表的初始化,插入、删除节点等功能,以及确定某一元素在单链表中的位置。 (1)初始化单链表; (2)依次采用尾插入法插入a,b,c,d,e元素; (3)输出单链表L; (4)输出单链表L的长度; (5)判断单链表L是否为空; (6)输出单链表L的第三个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入f元素; (9)输出单链表L; (10)删除L的第3个元素; (11)输出单链表L; (12)释放单链表。

3.概要设计 (1)为了实现上述程序功能,需要定义一个简化的线性表抽象数据类型:ADT LinearList { 数据对象:D={ a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|a i,a i+1 ∈D} 基本操作: InitList_L(L) 操作前提:L是一个未初始化的线性表 操作结果:将L初始化为一个空的线性表 CreateList_L(L) 操作前提:L是一个已初始化的空表 操作结果:建立一个非空的线性表L ListInsert_L(L,pos,e) 操作前提:线性表L已存在 操作结果:将元素e插入到线性表L的pos位置 ListDelete_L(L,pos,e) 操作前提:线性表L已存在 操作结果:将线性表L中pos位置的元素删除, 删除的元素值通过e返回 LocateList_L(L,e) 操作前提:线性表L已存在 操作结果:在线性表L中查找元素e, 若存在,返回元素在表中的序号位置;

3单链表的基本操作实现(菜单的建立)

#include typedef int elemtype; typedef struct node { elemtype data; struct node *next; }LNode,*LinkList; void InitList(LinkList &L) { L=new LNode; L->next=NULL; } void CreateList(LinkList &L) { int n; cout<<"请输入结点的个数:"; cin>>n; for(int i=1;i<=n;i++) { LinkList P; P=new LNode; cin>>P->data; P->next=L->next; L->next=P; } } void CreateList_H(LinkList &L) { int n; cout<<"请输入结点的个数:"; cin>>n; LinkList r=L; for(int i=1;i<=n;i++) { LinkList P; P=new LNode; cin>>P->data; r->next=P; r=P;

} r->next=NULL; } void OutList(LinkList L) { LinkList P; cout<<"\n输出单链表为:"; P=L->next; while(P!=NULL) { cout<data<<'\t'; P=P->next; } } LinkList getelem(LinkList L,int i) { LinkList P=L->next; int j=1; while(P&&jnext; j++; } if(j==i) return P; else return NULL; } LinkList Locateelem(LinkList L,elemtype e) { LinkList P=L->next; while(P&&P->data!=e) P=P->next; return P; } void InsertList(LinkList L,int i,elemtype x) { LinkList P; P=getelem(L,i); if(P!=NULL) {

数据结构与算法单链表的实现演示教学

单链表的实现 实现单链表的基本操作,必须包括初始化链表( 元素为空) 、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作。请编写程序,实现上述单链表的基本操作。 注意: 1. 元素类型可以自定义 2. 可以是带头结点的单链表或不带头结点的单链表 #include #include #include typedef int datatype; typedef struct node { datatype data; struct node *next; }LNode,*LinkList; /* //创建不带头结点的单链表 Linklist Create_LinkList() { return NULL; } */ //创建带头结点的单链表 LinkList Create_LinkList() { LinkList L=NULL; L=(LinkList)malloc(sizeof(LNode)); if(L) L->next=NULL; return L; } //打印单链表 void Print_LinkList(LinkList H) {

if(H == NULL) { printf("?????????\n"); } else { printf("head-->"); LinkList p=H->next; while(p!=NULL) { printf("%d",p->data); printf("-->"); p=p->next; } printf("\n"); } } //销毁单链表 void Destroy_LinkList(LinkList *H) { LinkList p, q; p = *H; while(p) { q = p; p = p->next; free(q); } *H = NULL; if(*H==NULL) printf(" 销毁成功,请退出\n"); else printf(" 销毁失败\n"); } //求表长 int Length_LinkList(LinkList L) { LNode *p=L; int j=0; while(p->next) { p=p->next; j++; } return j; } //表长功能实现 void length(LinkList L)

相关文档
最新文档