链表应用

链表应用
链表应用

#include

#include

#include

typedef struct{

char num[5];

char name[9];

char sex[3];

char phone[13];

char addr[31];

}DataType;

typedef struct node{

DataType data;

struct node *next;

}ListNode;

typedef ListNode *LinkList;

LinkList head;

ListNode *p;

int menu_select();

LinkList CreateList(void);

void InsertNode(LinkList head,ListNode *p); ListNode *ListFind(LinkList head);

void DelNode(LinkList head);

void PrintList(LinkList head);

void update(LinkList head);

//主函数

void main()

{

for(;;){

switch(menu_select())

{

case 1:

printf("**********************************\n");

printf("** 通讯录链表的建立*\n");

printf("***********************************\n");

head=CreateList();

break;

case 2:

printf("***********************************\n");

printf("** 通讯者信息的添加*\n");

printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");

printf("***********************************\n");

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

scanf("%s%s%s%s%s",p->data.num,p->https://www.360docs.net/doc/0c9420533.html,,p->data.se x,p->data.phone,p->data.addr);

InsertNode(head,p);

break;

case 3:

printf("************************************\n");

printf("* 通讯录的查询*\n");

printf("*************************************\n");

p=ListFind(head);

if(p!=NULL){

printf("编号姓名性别联系电话地址\n");

printf("-----------------------------------\n");

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.360docs.net/doc/0c9420533.html,,p->da ta.sex,p->data.phone,p->data.addr);

printf("------------------------------------\n");

}

printf("没查到要查询的通讯者!");

break;

case 4:

printf("***********************************\n");

printf("* 通讯记录信息的删除*\n");

printf("***********************************\n");

DelNode(head);

break;

case 5:

printf("************************************\n");

printf(" 通讯录链表的输出*\n");

printf("************************************\n");

PrintList(head);

break;

case 6:

printf("************************************\n");

printf(" 通讯录链表的更新*\n");

printf("************************************\n");

update(head);

break;

case 0:

printf("\t 再见! \n");

return;

}

}

}

/*菜单选择函数程序*/

int menu_select(){

int sn;

printf("通讯录管理系统\n");

printf("------------------------\n");

printf("1.通讯录链表的建立\n");

printf("2.通讯者结点的插入\n");

printf("3.通讯者结点的查询\n");

printf("4.通讯者结点的删除\n");

printf("5.通讯者链表的输出\n");

printf("6.通讯录链表的更新\n");

printf("0.退出管理系统\n");

printf("------------------------\n");

printf(" 请选择0-6:");

for(;;){

scanf("%d",&sn);

if(sn<0||sn>6){

printf("\n\t输入错误,重选0-6:");

}

else{

break;

}

}

return sn;

}

/*用尾插法建立通讯记录链表算法*/

LinkList CreateList(void){

LinkList head=(ListNode *)malloc(sizeof(ListNode));

ListNode *p,*rear;

int flag=0;

rear=head;

while(flag==0){

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

printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");

printf("-------------------------------------\n");

scanf("%s%s%s%s%s",p->data.num,p->https://www.360docs.net/doc/0c9420533.html,,p->data .sex,p->data.phone,p->data.addr);

rear->next=p;

rear=p;

printf("结束建表吗?(1/0):");

scanf("%d",&flag);

}

rear->next=NULL;//终端结点指针域置空

return head;

}

/*在通讯录链表head中插入结点*/

void InsertNode(LinkList head,ListNode *p){

ListNode *p1,*p2;

p1=head;

p2=p1->next;

while(p2!=NULL&&strcmp(p2->data.num,p->data.num)<0) {

p1=p2;

p2=p2->next;

}

p1->next=p;

p->next=p2;

}

/*有序通讯录链表上的查找*/

ListNode *ListFind(LinkList head){

ListNode *p;

char num[5];

char name[9];

int xz;

printf("------------------------------\n");

printf(" 1.按编号查询\n");

printf(" 2.按姓名查询\n");

printf("-------------------------------\n");

printf(" 请选择:");

p=head->next;

scanf("%d",&xz);

if(xz==1){

printf("请输入要查找者的编号:");

scanf("%s",num);

getchar();//关键问题

while(p&&strcmp(p->data.num,num)<0)

p=p->next;

if(p==NULL||strcmp(p->data.num,num)>0) p=NULL;

}

else

if(xz==2){

printf("请输入要查找者的姓名:");

scanf("%s",name);

getchar();//关键问题

while(p&&strcmp(p->https://www.360docs.net/doc/0c9420533.html,,name)!=0) p=p->next;

}

return p;

}

/*通讯录链表上结点的删除*/

void DelNode(LinkList head){

char jx;

ListNode *p,*q;

p=ListFind(head);

if(p==NULL){

printf("没有查到要删除的通讯者!");

return;

}

printf("真的要删除该结点吗?(y/n):");

scanf("%c",&jx);

if(jx=='y'||jx=='Y'){

q=head;

while(q!=NULL&&q->next!=p)

q=q->next;

q->next=p->next;

free(p);

printf("通讯者已被删除!");

}

}

/*通讯链表的输出函数*/

void PrintList(LinkList head){

ListNode *p;

p=head->next;

printf("编号姓名性别联系电话地址\n");

printf("----------------------------------------\n");

while(p!=NULL){

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.360docs.net/doc/0c9420533.html,,p->data.sex,p->data.phone,p->data.addr);

printf("---------------------------------------------------\n");

p=p->next;

}

}

void update(LinkList head){

char jx;

ListNode *p,*q;

p=ListFind(head);

if(p==NULL){

printf("没有查到要更新的记录!");

return;

}

printf("真的要更新该结点吗?(y/n):");

scanf("%c",&jx);

if(jx=='y'||jx=='Y'){

printf("请重新输入记录:\n");

scanf("%s%s%s%s%s",p->data.num,p->https://www.360docs.net/doc/0c9420533.html,,p->data.se x,p->data.phone,p->data.addr);

printf("通讯链表已更新!\n");

}

}

实验一 顺序表与链表 成品

实验一顺序表与链表 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、对线性表相应算法的时间复杂度进行分析。 4、理解顺序表、链表数据结构的特点(优缺点)。 二、实验预习 说明以下概念 1、线性表:线性表是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限 序列。 2、顺序表:线性表的顺序存储结构或顺序映像,通常,称这种存储结构的线性表为顺序表。 3、链表:指针域中存储的信息称作指针或链。N个接点连接成一个链表,故又称线性链表。 三、实验内容和要求 1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。 ●#include ●#include ●#define ERROR 0 ●#define OK 1 ● ●#define INIT_SIZE 5 /*初始分配的顺序表长度*/ ●#define INCREM 5 /*溢出时,顺序表长度的增量*/ ●typedef int ElemType; /*定义表元素的类型*/ ●typedef struct Sqlist{ ●ElemType *slist; /*存储空间的基地址*/ ●int length; /*顺序表的当前长度*/ ●int listsize; /*当前分配的存储空间*/ ●}Sqlist; ● ●int InitList_sq(Sqlist *L); /* 构造一个空的线性表L */ ●int CreateList_sq(Sqlist *L,int n); /* 不断地插入元素 */ ●int ListInsert_sq(Sqlist *L,int i,ElemType e);/* 在L中第i个位置之前插 入一个数据元素e,L的长度加1 */ ●int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/ ●int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/

双向循环链表的建立插入与删除

创建双向循环链表的源代码: #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;

实验二 链表操作实现

实验二链表操作实现 实验日期: 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 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; }

顺序表及链表的应用

设计一顺序表的应用代码 Head.h #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量 #define STACK_INIT_SIZE 100//栈存储空间初始分配量 #define STACKINCREMENT 10//栈存储空间分配增量 #define MAXQSIZE 10//最大队列长度 typedef int ElemType; typedef char SElemType; typedef int QElemType; typedef struct{ int *elem;//存储空间基址 int length;//当前长度 int listsize;//当前分配的存储容量 }SqList; typedef struct{ SElemType *base;//在栈构造之前和销毁之后,base的值为null SElemType *top;//栈顶指针 int stacksize;//当前已分配的存储空间,以元素为单位 }SqStack; typedef struct { QElemType *base;//初始化的动态分配存储空间 int front;//头指针,若队列不空,指向队列头元素 int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置}SqQueue; void Check1(); void Check2(); void Check3(); void Check4(); int InitList_Sq(SqList *L); int CreateList(SqList *L); int DeleteElem_Sq(SqList *L); int PrintElem(SqList L); int DeleteElem_1(SqList *L); int DevideList_Sq(SqList L,SqList *La,SqList *Lb); int InitStack(SqStack *L); int Push(SqStack *S,SElemType e); int StackEmpty(SqStack S); int GetTop(SqStack S,SElemType *e); int Pop(SqStack *S,SElemType *e); int Correct(char exp[], int n); int InitQueue(SqQueue *Q); int CreateQueue(SqQueue *Q);

链表实验报告

C语言程序设计实验报告 实验一:链表的基本操作一·实验目的 1.掌握链表的建立方法 2.掌握链表中节点的查找与删除 3.掌握输出链表节点的方法 4.掌握链表节点排序的一种方法 5.掌握C语言创建菜单的方法 6.掌握结构化程序设计的方法 二·实验环境 1.硬件环境:当前所有电脑硬件环境均支持 2.软件环境:Visual C++6.0 三.函数功能 1. CreateList // 声明创建链表函数 2.TraverseList // 声明遍历链表函数 3. InsertList // 声明链表插入函数 4.DeleteTheList // 声明删除整个链表函数 5. FindList // 声明链表查询函数 四.程序流程图 五.程序代码 #include #include typedef int Elemtype; typedef int Status; typedef struct node//定义存储节点 { int data;//数据域 struct node *next;//结构体指针 } *linklist,node;//结构体变量,结构体名称 linklist creat (int n)//创建单链表 { linklist head,r,p;//定义头指针r,p,指针 int x,i; head=(node *)malloc(sizeof(node));//生成头结点

r=head;//r指向头结点 printf("输入数字:\n"); for(i=n;i>0;i--)//for 循环用于生成第一个节点并读入数据{ scanf("%d",&x); p=(node *)malloc(sizeof(node)); p->data=x;//读入第一个节点的数据 r->next=p;//把第一个节点连在头结点的后面 r=p;//循环以便于生成第二个节点 } r->next=0;//生成链表后的断开符 return head;//返回头指针 } void output (linklist head)//输出链表 { linklist p; p=head->next; do { printf("%3d",p->data); p=p->next; } while(p); printf("\n") } Status insert ( linklist &l,int i, Elemtype e)//插入操作 { int j=0; linklist p=l,s; while(jnext; ++j; } if(!p || j>i-1) return -1; else { s=(node *)malloc(sizeof(node)); s->data=e; s->next=p->next; p->next=s; return 1; } } Status delect ( linklist &l,int i, Elemtype &e)//删除操作 { int j=0; linklist p=l,q; while(jnext) { p=p->next; ++j; } if(!p->next || j>i-1) return -1;

双向链表基本操作

双向链表 输入一个双向链表,显示些双向链表并对此双向链表排序运行结果: 源程序: #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年11月25日 计算机科学与技术系 2016年制

一、实验环境 Windows32位系统Microsoft Visual C++ 二、实验目的 掌握链表的使用 三、实验内容 用单向链表实现的简单学生管理系统 四、数据结构与算法思想描述 对单链表的增删查改 五、程序清单 /* 函数信息: 菜单选项 void Menu(); 初始化链表 void InitLink(node *head); 输出单个学生信息 void SingleShow(node *p); 尾插法 node* AddLink(node *p,char *num); 建立链表,并输入学生信息。 node *CreateLink(node *head); 查找学生信息,查找则返回查找位置前一个点 node *SearchLink(node *head, char *num); 增加学生信息,先进行查找,若已有则提示用户是否修改,否则增加void InsertLink(node *head, char *num); 修改学生信息,先进行查找,若已有则提示用户修改,否则退出 void ModifyLink(node *head, char *num); 删除学生信息 void DeleteLink(node *head, char *num); 显示所有学生信息 void Display(node *head) */ #include #include #include #include #include #define MAXM 50 //学生管理系统名字学号成绩的最大字节数 #define Tip "\t\tName\t\tNumber\t\tScore\n"

双向链表实验报告

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;

实验四双向链表

实验名称:实验四双向或循环链表的基本操作 一、实验项目名称:双向或循环链表的基本操作 二、实验目的 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、程序清单

实验2 单链表的操作及其应用

仲恺农业工程学院实验报告纸 计算机科学与工程学院(院、系)计算机科学与技术专业计机092 班组数据结构课 实验二链表的操作及其应用 一、实验目的 了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在Turbo C实现以上操作更好的了解书本上的内容并体会线性表的两种存储结构的区别。 二、实验内容 ⑴单链表的插入算法 ⑵单链表的删除算法 ⑶循环链表的插入和删除算法(选做) 源程序: #include #include #include #include #define LEN sizeof(LNode) //定义LEN为一个节点的长度 enum BOOL{False,True}; //定义BOOL型 typedef struct node {char data; //数据域 struct node *next;//指向下一个节点的指针 }LNode,*LinkList; void CreatList(LinkList &,int); //生成一个单链表 BOOL ListInsert(LinkList &,int,char); //在单链表中插入一个元素 BOOL ListDelete(LinkList &,int,char &); //在单链表中删除一个元素 void ListPrint(LinkList); //显示单链表所有元素 void main() {LinkList L; BOOL temp; int num,loc,flag=1; char j,ch; //---------------------程序解说----------------------- printf("本程序实现链式结构的线性表的操作。\n"); printf("可以进行插入,删除等操作。\n");

链表的基本操作(基于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

c数据结构单链表的建立与基本应用

#include"stdio.h" #include"stdlib.h" typedef struct node { int data; struct node *next; }Lnode,*Linklist; input(Lnode *p,int n)//实现用键盘顺序输入链表数据{ Lnode *s;int i,d; printf("请输入数据:"); for(i=1;i<=n;i++) { if(i==1) { scanf("%d",&d); p->data=d; continue; } if(n==1)break; scanf("%d",&d);

s=(Linklist)malloc(sizeof(Lnode)); s->data=d; p->next=s; s->next=NULL; p=s;//使当前指针指向链表尾部节点 } } output(Lnode *p,int n)//实现输出当前链表所有数据 { int i=1; printf("当前链表的值为:"); while(p->next!=NULL) { printf("%d ",p->data); p=p->next; i++; } if(i==n)//当是最后一个节点时,其next已经是空,所以最后一个节点数据无法用while循环写出,所以另用了一个计数器i printf("%d",p->data); }

insert(Lnode *p,int i,int e)//实现在第i个元素之后插入新元素{ int j=0;Lnode *s; while(p&&jnext;++j;}if(!p||j>i-1)return 0; s=(Linklist)malloc(sizeof(Lnode)); s->data=e;s->next=p->next;p->next=s; return 1; } delet(Lnode *p,int i)//实现删除链表中第i+1个元素 { int j=0;Lnode *q; while(p->next&&jnext;++j; } if(!(p->next)||j>i-1)return 0; q=p->next;p->next=q->next; free(q); return 1; } search(Lnode *p,int e,int n) {

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

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

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

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

数据结构实验三——双链表的操作 初始化 插入 输出

数据结构实验报告 题目:双链表的操作 班级:

姓名: 学号: 一、实验要求和目的 1.理解双链表的基本操作 2.了解双链表的建立和输出 3.掌握双链表的插入、删除等实现方法 二、实验内容 编写一个程序,实现双链表的各种基本运算(假设双链表的元素类型为char),并在此基础上设计一个程序,完成如下功能: (1)初始化双链表h; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出双链表h; (4)输出双链表h长度; (5)判断双链表h是否为空; (6)输出双链表h的第3个元素; (7)输出元素a的位置; (8)在第4个位置上插入元素f; (9)输出双链表h; (10)删除h的第3个元素; (11)输出双链表h; (12)释放双链表h。 三、设计思想 本次实验主要考察了多双链表的基本操作,包括初始化链表,插入节点,删除节点,寻找元素的位置,判断链表是否为空,输出链表等。本次实验在逻辑上没有什么难度,首先是构造一个结构体,包括向前的指针和向后的指针,其次是构造函数来实现不同的功能,最后是在主函数中初始化链表,再调用构造函数。 四、主要源代码

#include #include typedef char datatype; typedef struct node { datatype data; struct node *prior; struct node *next; }linklist; void insert(linklist *L, datatype e) //采用尾插法插入元素{ linklist *p,*q; p=L; while(p->next!=NULL) p=p->next; q=(linklist *)malloc(sizeof(linklist)); q->data=e; q->prior=p; p->next=q; q->next=NULL; } void disp(linklist *L) //输出链表数据 { linklist *p; p=L->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); } void length(linklist *L) //输出链表长度 { linklist *p; p=L; int i=0; while(p->next!=NULL) {

相关文档
最新文档