当前位置:文档之家› 链表与文件的结合使用

链表与文件的结合使用

链表与文件的结合使用
链表与文件的结合使用

#include

#include

#include

#include

#define fileFormat "%s %d %d %s %s\n"

typedef struct classroom //定义结构体

{

char site[20]; //地理位置一个汉字占两个字符

int num; //教室编号

int zuowei; //座位数

char tv[20]; //是否有多媒体

char use[20]; //是否可用

struct classroom * next;

} Node;

/**********************************************************************/ void information()

{

printf("\n\n\n\t\t\t 教室信息管理系统");

printf("\n\t\t\t 版本:简易版\n\n");

printf("\n \t\t\t 20115年12月10日\n");

printf("\t\t\t 实验室\n");

printf("\n\t\t\t 吴亮制作\n");

}

/****************************************************************/

int menu_select() //菜单选项

{

int c;

do{

system("cls");

printf("\t\t #────#\n");

printf("\t\t # ^^^^^^^^^^^^^^^^^^ #\n");

printf("\t\t # 教室信息管理系统#\n");

printf("\t\t #════════════#\n");

printf("\t\t │││\n");

printf("\t\t │1-添加│2-查询│\n");

printf("\t\t │││\n");

printf("\t\t │3-删除│4-修改│\n");

printf("\t\t │││\n");

printf("\t\t │5-全部显示│0-退出│\n");

printf("\t\t └─────────────┘\n");

printf("\t\t请您选择(0-5):");

scanf("%d",&c);

}while(c<0&&c>5);

return c;

}

/***************************用追加写入文件******************/

FILE * fp;

Node * p;

p=(Node * )malloc(sizeof(Node));

p=head;

if((fp=fopen("file.txt","a"))==NULL)

{

printf("cannot find the file");

return ;

}

while(p!=NULL)

{

fprintf(fp,fileFormat ,p->site, p->num,p->zuowei,p->tv,p->use);

p=p->next;

}

printf("添加成功");

fclose(fp);

}

/*****************用W 清空写入文件*************************/

void newinfile(Node *head)

{

FILE * fp;

Node * p;

p=(Node * )malloc(sizeof(Node));

p=head;

if((fp=fopen("file.txt","w"))==NULL)

{

printf("cannot find the file");

return ;

}

while(p!=NULL)

{

fprintf(fp,fileFormat ,p->site, p->num,p->zuowei,p->tv,p->use);

p=p->next;

}

printf("添加成功");

fclose(fp);

}

void Nodecreat()/*************创建链表*******************/

{

Node * head;

Node *p1,*p2;

int i=0;

char m='y';

head=(Node *)malloc(sizeof(Node));

do

{

p1=(Node *)malloc(sizeof(Node));

printf("\t地理位置:\n");

scanf("%s",p1->site);

printf("\t教室编号:\n");

scanf("%d",&p1->num);

printf("\t座位数:\n");

scanf("%d",&p1->zuowei);

printf("\t是否有多媒体?(是/否):\n");

scanf("%s",p1->tv);

printf("\t是否可用?(是/否):\n");

scanf("%s",p1->use);

if(head==NULL)

head=p1;

else

p2->next =p1;

p1->next=NULL;

p2=p1;

printf("\t是否继续添加?(y/n)\n");

scanf(" %s",&m);

i++;

} while(m!='n');

p2->next =NULL;

writeinfile(head);

}

/**********************遍历链表取得头指针********************/

Node * TraversalNode()

{

FILE * fp;

int i=0;

Node * link,* p,* m;

p=NULL;

m=p;

if((fp=fopen("file.txt","r"))==NULL)

{

printf("cannot find the file.");

system("pause");

return 0;

}

while(!feof(fp))//读到文本最后

{

link=(Node *)malloc(sizeof(Node));

fscanf(fp,fileFormat,link->site,&link->num,&link->zuowei,link->tv,link->use);

if(p==NULL)

p=link;

else

m=link;

}

fclose(fp);

return p;

}

/*************************求表的长度**************************/

int Length(Node * head)

{

int i=0;

Node * p;

p=head;

while(p!=NULL)

{

p=p->next;

i++;

}

printf("jidian=%d",i);

return(i);

}

/********************************按教室编号进行索引查找教室*****************************************/

void quiry()

{ FILE * fp;

int i=0;

int n,t;

Node * p,* head;

p=TraversalNode();

head=p;

printf("请输入教室编号:\n");

scanf("%d",&n);

if((fp=fopen("file.txt","r"))==NULL)

{

printf("找不到文件");

return;

}

t=Length(head);

while(!feof(fp))//读到文本最后

{

fscanf(fp,fileFormat,p->site,&p->num,&p->zuowei,p->tv,p->use);

if(p->num==n)

{

break;

}

else

i++;

}

}

fclose(fp);

if(i>t)

{

printf("不存在该数据");

}

else

{

printf("查找结果为:\n");

printf("地理位置教室编号座位数是否有多媒体是否可用\n");

printf("%8s%10d%8d%14s%10s\n",p->site,p->num,p->zuowei,p->tv,p->use);

}

}

/********************按教室编号查找****************/

Node * Get (Node * head,int i)

{

int j=0;

Node * p;

p=head;

while(jnext!=NULL)

{

p=p->next;

j++;

}

return p;

}

//**************************************************信息删除*************************/ void delet()

{

int i=0,t,m;

Node * p,* head;

Node * p1;

p=TraversalNode();

head=p;

printf("请输入要删除的教室的编号:\n");

scanf("%d",&m);

t=Length(head);

while(p->next !=NULL)//读到文本最后

{

if(p->num==m)

{

p=p->next ;

}

if(i>=t)

printf("未找到该教室信息");

else

{

printf("查找结果为:\n");

printf("地理位置教室编号座位数是否有多媒体是否可用\n");

printf("%8s%10d%8d%14s%10s\n",p->site,p->num,p->zuowei,p->tv,p->use);

head=TraversalNode();

if(i>1)

{

p1=Get(head,i-1);

p1->next=p->next;

free(p);

newinfile(head);

}

else if(i==1)

{

head=head->next ;

newinfile(head);

}

else

printf("delete file");

printf("删除成功");

}

}

//////******************信息修改**************************/

void modify()

{

int i=0,t,m;

Node * p,* head;

Node * p1,* p3;

p=TraversalNode();

head=p;

printf("请输入要修改的的教室的编号:\n");

scanf("%d",&m);

t=Length(head);

while(p->next !=NULL)//读到文本最后

{

if(p->num==m)

{

p=p->next ;

}

if(i>t)

printf("未找到该教室信息");

else

{

p3=(Node *)malloc(sizeof(Node));

printf("查找结果为:\n");

printf("地理位置教室编号座位数是否有多媒体是否可用\n");

printf("%8s%10d%8d%14s%10s\n",p->site,p->num,p->zuowei,p->tv,p->use);

printf("请输入修改后的教室信息。\n");

printf("\t地理位置:\n");

scanf("%s",p3->site);

printf("\t教室编号:\n");

scanf("%d",&p3->num);

printf("\t座位数:\n");

scanf("%d",&p3->zuowei);

printf("\t是否有多媒体?(是/否):\n");

scanf("%s",p3->tv);

printf("\t是否可用?(是/否):\n");

scanf("%s",p3->use);

if(i>1)

{ p1=Get(head,i-1);printf("%8s%10d%8d%14s%10s\n",p1->site,p1->num,p1->zuowei,p1->tv,p1->use);

p1->next=p3;

p3->next=p->next;

newinfile(head);

}

else if(i==1)

{

p3->next =head->next;

head=p3;

newinfile(head);

}

else

printf("delete failed");

printf("修改成功");

}

}

/**************************信息浏览*****************************/

void show()

Node * p;

p=TraversalNode();

printf("地理位置教室编号座位数是否有多媒体是否可用\n");

while(p!=NULL)

{

printf("%8s%10d%8d%14s%10s\n",p->site,p->num,p->zuowei,p->tv,p->use);

p=p->next ;

}

system("pause");

printf("是否需要修改(y/n)?");

scanf("%s",&m);

if(m!='n')

{

modify();

}

}

/**********************************主函数****************************************////********************/

void main()

{

void information();

while(1)

{

switch(menu_select())

{

case 1:

system("cls");

printf("\t\t***********教室信息添加************\n\n");

Nodecreat();

system("pause");

break;

case 2:

system("cls");

printf("\t\t***********教室信息查询************\n\n");

quiry();

system("pause");

break;

case 3:

system("cls");

printf("\t\t***********教室信息删除************\n\n");

delet();

system("pause");

break;

case 4:

system("cls");

system("pause");

break;

case 5:

system("cls");

printf("\t\t***********教室信息浏览************\n");

show();

system("pause");

break;

case 0:

printf("感谢使用,请给好评哦!\n");

system("pause");

return ;

}

}

}

实验二 链表操作实现

实验二链表操作实现 实验日期: 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 #include #define OVERFLOW -2 #define ERROR 0 #define OK 1 typedef int status; //双向循环链表的存储结构 typedef struct DuLNode { int data; int Length; struct DuLNode *prior; struct DuLNode *next; } DuLNode,*DuLinkList; //构建一个空的双向循环链表 void InitList(DuLNode **p) { *p=(DuLNode *)malloc(sizeof(DuLNode)); if(*p) { (*p)->next=(*p)->prior=*p; (*p)->Length=0; } else exit(OVERFLOW); } //双向循环链表的创建 void Create(DuLinkList &L,int n) { //输入n个元素的值,建立带头结点的双线循环链表L DuLinkList p=L,q; int i; for(i=1;i<=n;i++) { q=(DuLinkList)malloc(sizeof(DuLNode)); printf("您该输入第%d个元素的值了:",i); scanf("%d",&q->data); p->next =q; q->prior=p; q->next=L; L->prior =q; p=q;

L->Length ++; } } //结点的输出 void Display( DuLinkList L) { DuLinkList p; printf("双向循环链表中的结点的数据为:"); for(p=L->next ;p->next !=L;) { printf("%d",p->data); printf(" 、"); p=p->next ; } printf("%d\n",p->data ); } int main() { DuLinkList L; int n,i; InitList(&L) ; printf("你想创建几个循环节点就输入几就行啦,请输入:"); scanf("%d",&n); Create(L,n); Display(L); } 双向循环链表插入源代码: #include #include #define OVERFLOW -2 #define ERROR 0 #define OK 1 typedef int status; //双向循环链表的存储结构 typedef struct DuLNode { int data; int Length; struct DuLNode *prior; struct DuLNode *next; } DuLNode,*DuLinkList; //构建一个空的双向循环链表

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

实验一单链表 #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;

双向链表的创建

#include #include typedef struct LNode { int data; int length; struct LNode *next; struct LNode *prior; }DuLNode,*DuLinkList; void initlist(DuLNode **p){ *p=(DuLinkList)malloc(sizeof(DuLNode)); (*p)->next=(*p)->prior=NULL; } void create(DuLNode **p,int n){ DuLinkList q; printf("输入%d个双向链表的元素\n",n); for(int i=n;i>0;--i)//创建n个元素的双向链表。 { DuLinkList s; s=(DuLinkList)malloc(sizeof(DuLNode)); scanf("%d",&(s->data)); if(i==n) {*p=s; q=s; s->next=s->prior; s->prior=s->next; } else { q->next=s; s->next=*p; (*p)->prior=s; s->prior=q; q=s; } } (*p)->length=n; }

void Display(DuLinkList L,int n){ int i; for(i=0;inext; } } int main(int argc, char* argv[]) { DuLinkList L; initlist(&L); create(&L,3); Display(L,3); printf("双向链表的长度%d\t",L->length); return 0; }

C语言_双向循环链表、增删查改、判断回文、排序、论文+代码

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法A设计实践 课程代码: 6015059 题目一: 线性表的链式表示和实现 题目二: 利用栈实现表达式求解 年级/专业/班: 2011/信科/2班 学生姓名: XXX 学号: XXX 开始时间:2014 年 5 月28 日 完成时间:2014 年 6 月28 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (1) 1 引言 (2) 2 实验一 (3) 2.1整体设计思路 (3) 2.2编码 (3) 2.3程序演示 (6)

摘要 随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,数据结构与算法的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。数据结构与算法旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。 本次数据结构实践的第一个实验是线性表的链式表示和实现,要求动态地建立循环链表并实现循环链元素的插入,删除,查询;使用双向链的结构实现判断一个录入的字符串是否是回文;建立一个单向链表,实现其内元素非递减排序。 关键词:数据结构与算法线性表链式结构栈表达式求解

1 引言 1.1问题的提出 数据结构课程设计是重要地实践性教学环节。在进行了程序设计语言课和《数据结构与算法》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。本课程设计是数据结构中的一个关于线性表链式表示的实现还有用栈实现表达式求解,此课程设计要求对栈存储结构和链表存储结构非常熟悉,并能熟练使用它们。 1.2C语言 C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有时一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。 1.3C语言发展过程 1973年,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。 1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。 1.4任务 题目一:线性表的链式表示和实现 第一个实验主要是实现一些线性表的基本操作。包括(1)动态地建立循环链表;(2)实现循环链元素的插入,删除,查询;(3)使用双向链的结构实现判断一个录入的字符串是否是回文;(4)建立一个单向链表,实现其内元素非递减排序。

双向链表基本操作

双向链表 输入一个双向链表,显示些双向链表并对此双向链表排序运行结果: 源程序: #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;/*尾结点成为头结点*/ }

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

江南大学物联网工程学院上机报告
课程名称 班 级 数据结构 上机名称 姓 名 链表的实现和应 用 上机日期 学 号 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;

双向链表实验报告

13软工转本1 钱剑滨实验报告 双向链表实验报告 信息工程系 13软工转本1 日期 2016年03月12日 姓名钱剑滨学号 13131116 电话 一、实验内容 编写关于双向链表操作的C语言程序,要求包含双向链表的创建(生成)、输出(遍历)、查找、任意位置插入、有顺序插入、删除、等。 二、实验步骤 1.分析操作所需思路,熟练运用单链表的各种特点。 2.编写程序,利用函数特性进行操作。 3.运行程序,纠正错误,对预测结果进行验证。 4.分析总结单链表的优缺点,并可以做到熟练掌握双向链表的各种 操作。 三、设计概要 1.本实验包含了7个函数: a)主函数main() b)创建链表函数Listcreate() c)数据输出函数Listprint() d)查找数据函数Listlocate() e)无序插入函数Listinsert_discretion () f)有序插入函数Listinsert_order g)删除数据函数Listdelete() 2.明确函数的功能; a)Listcreate() 创建一个可控长度的斐波那契数列的双向链表。 b)Listprint() 将此链表中的数据全部输出。 c)Listlocate() 查找此链表中任意位置元素的值。 d)Listinsert_discretion ()向此链表的某个位置插入一组数据。 e)Listinsert_order() 向数列中插入一个数,使插入后的数列任 然有序 f)Listdelete() 将此链表的某个位置的一组数据删除。

四、程序设计 1.函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include #include typedef struct number //定义结构体 { struct number *prior; int num; struct number *next; }number; number *head; //定义全局变量头节点 int k = 0; //k记录元素个数,防止溢出 /*函数声明*/ void Listcreate(); //建立链表 void Listprint(); //全体输出 void Listlocate(); //查找 void Listinsert_discretion(); //任意位置插入 void Listinsert_order(); //有顺序插入 void Listdelete(); //删除 2.主函数main() void main() { int select; printf("1、输入斐波那契数列的个数\n"); printf("2、全部输出数列\n"); printf("3、查找定位数列的元素\n"); printf("4、添加数列元素\n"); printf("5、插入顺序数列元素\n"); printf("6、删除数列元素\n"); printf("-------------------------------------\n"); while (1) { printf("请选择序号\n"); scanf("%d", &select); switch (select) { case 1: Listcreate(); break; //链表创建 case 2: Listprint(); break; //全链表输出 case 3: Listlocate(); break; //元素查找 case 4: Listinsert_discretion(); break; //任意位置插入

单链表的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:单链表建立及操作 班级序号:师范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。如下所示:

实验四双向链表

实验名称:实验四双向或循环链表的基本操作 一、实验项目名称:双向或循环链表的基本操作 二、实验目的 1)通过实验理解双向链表或循环链表的结构。 2)通过实验掌握双向链表或循环链表的基本操作。 三、实验基本原理 1、数据结构 2、算法思想 1.构思:双向循环链表的创建建立在双向链表上,所以建立双向循环表每个结点都有三个属性:数据域、上个结点、下个结点,其中第一个结点的上一个结点是最后一个结点,最后一个结点的下一个结点就是第一个结点,所以就构成了双向循环链表。 双链表的单元类型定义 Type struct DuLNode { Elemtype data; Struct DuLNode *prior;//建立表头结点 Struct DuLNode *next;//建立表尾结点 } DuLNode,*DuLinkList;

3、算法描述 ①建立一个双链表,输入元素。由p和s两个指针来存放元素。以0判断是否结束,如果不为0 ,则继续,为0则截止。 s->data=e; s->next=p->next; s->prior=p; p->next->prior=s; p->next=s; p=s; ②查找元素:首先判断位置是否合法(p->data!=e&& p->next!=head)若合法进行查找运算。 需要引用DuLinkList,(DuLinkList &L)输入要查找的元素的位置,判断双链表中是否有该元素,如果是则输出该元素,如果没有,则提示没有该元素。 ③插入元素:判断位置是否合法(i<1||i>L.Length),若合法进行查插入运算。需要引用DuLinkList,(DuLinkList &L)输入要插入的元素及其位置,插入数据然后输出数据。 ④删除元素:判断位置是否合法(i<1||i>L.Length),若合法进行查删除运算。输入要插入的元素及其位置,删除该数据。 本程序实现双链表的创建、查找、插入、删除、显示、菜单为主的六个函数组成。 四、主要仪器设备及耗材 电脑 运行环境:visual C++6.0 五、实验步骤 (1)打开visual C++,新建工程console application工程,新建文件C++ source file。 (2)输入自己的程序代码 (3)如果有报错则修改程序。无则组建调试 六、实验数据及处理结果 1、程序清单

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

#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

用双向循环链表求解约瑟夫环

用双向循环链表求解约瑟夫环 学校:东北大学 专业:计算机科学与技术

1.问题描述 Josephus排列问题定义如下:假设n个竞赛者排成一个环形。给定一个正整数m≤n,从第1人开始,沿环计数,第m人出列。这个过程一直进行到所有人都出列为止。最后出列者为优胜者。全部出列次序定义了1,2,…n的一个排列。称为(n,m)Josephus排列。例如,(7,3)Josephus排列为3,6,2,7,5,1,4。【实验要求】 设计求解Josephus排列问题程序。 (1)采用顺序表、单链表或双向循环链表等数据结构。 (2)采用双向循环链表实现Josephus排列问题,且奇数次顺时针轮转,偶数次逆时针轮转。 (3)推荐采用静态链表实现Josephus排列问题。 2.需求分析 本程序要求根据输入的人数n和给定的正整数m,求得约瑟夫排列,且奇数次顺时针轮转,偶数次逆时针轮转。故可利用双向循环链表建立存储结构,利用双向循环链表的遍历与删除操作实现功能要求。 3.概要设计 1.抽象数据类型定义: typedef struct DuLNode { int data; struct DuLNode *prior; struct DuLNode *next; }DuLNode,*DuLinkList; //定义双向循环链表 2.基本操作 int InitList_Dul(DuLinkList &L) //建立一个只含头结点的空双向循环链表 int CreateList_DuL(DuLinkList &L,int n) //建立一个带头结点的含n个元素的 双向循环链表L int ListDelete_DuL(DuLinkList &L,DuLinkList x) //删除指针x指向的结点 3.设计思路 首先建立一个双向循环链表作为存储结构,每个结点的数据域存储每个人的编号,然后根据给定的m值对整个链表进行遍历,找到所要找的结点后,输出该结点的数据域的值,并在双向循环链表中删除该结点,重复这样的操作,一直到所有的人都出列,依次输出的数列即为所求的Josephus排列。 4.详细设计 typedef struct DuLNode { int data; struct DuLNode *prior;

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

大学数据结构实验报告 课程名称数据结构实验第(四)次实验实验名称链表的基本操作 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期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.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程

相关主题
文本预览
相关文档 最新文档