数据结构试验一 线性表实现 单链表入门
来源:互联网 发布:金牛行情分析软件 编辑:程序博客网 时间:2024/05/21 23:34
前面是基础实验,后面有一个完整程序
头文件
#include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;/**********************************//*顺序表的头文件,文件名sequlish.h*//**********************************/#define MAXSIZE 100typedef int datatype;typedef struct{ datatype a[MAXSIZE]; int size;} sequence_list;/**********************************//*函数名称:initseqlist() *//*函数功能:初始化顺序表 *//**********************************/void initseqlist(sequence_list *L){ L->size=0;}/**********************************//*函数名称:input() *//*函数功能:输入顺序表 *//**********************************/void input(sequence_list *L){ datatype x; initseqlist(L); printf("请输入一组数据,以0做为结束符:\n"); scanf("%d",&x); while (x) { L->a[L->size++]=x; scanf("%d",&x); }}/**********************************//*函数名称:inputfromfile() *//*函数功能:从文件输入顺序表 *//**********************************/void inputfromfile(sequence_list *L,char *f){ int i,x; FILE *fp=fopen(f,"r"); L->size=0; if(fp){ while(!feof(fp)) fscanf(fp,"%d",&L->a[L->size++]); fclose(fp); }}/**********************************//*函数名称:print() *//*函数功能:输出顺序表 *//**********************************/void print(sequence_list *L){ for (int i=0; i<L->size; i++){ printf("%5d",L->a[i]); if((i+1)%10==0) puts(""); } puts("");}
反转一个序列
/**********************************//*文件名称:lab1-01.cpp *//**********************************/#include"sequlish.h"void reverse(sequence_list *L){ int n=L->size; for(int i=0;i<n/2;i++) swap(L->a[i],L->a[n-1-i]);}int main(){ sequence_list L;/*定义顺序表*/ input(&L); /*输入测试用例*/ print(&L); /*输出原表*/ reverse(&L); /*顺序表倒置*/ print(&L); /*输出新表*/}
/**********************************//*文件名称:lab1_02.cpp *//**********************************//*将顺序表L1中的数据进行分类,奇数存放到存到顺序表L2中,偶数存到顺序表L3中*/#include "sequlish.h"void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3){ initseqlist(L2); initseqlist(L3); for(int i=0;i<L1->size;i++){ if(L1->a[i]&1) L2->a[L2->size++]=L1->a[i]; else L3->a[L3->size++]=L1->a[i]; }}int main(){ sequence_list L1,L2,L3;/*定义三个顺序表*/ input(&L1); /*输入L1*/ sprit(&L1,&L2,&L3); /*对L1进行分类*/ print(&L1); /*输出L1、L2和L3*/ print(&L2); print(&L3);}
合并的时候要注意是否到了尾节点
/*已知顺序表L1,L2中数据由小到大有序将L1与L2中的数据合并到L3中,且L3中按升序排列。*/#include "sequlish.h"void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3){ initseqlist(L3); int num=L1->size+L2->size; int p1=0,p2=0; while(p1+p2<num) { if(p1==L1->size) L3->a[L3->size++]=L2->a[p2++]; else if(p2==L2->size) L3->a[L3->size++]=L1->a[p1++]; else L3->a[L3->size++]=L1->a[p1]<L2->a[p2]?(L1->a[p1++]):(L2->a[p2++]); }}int main(){ sequence_list L1,L2,L3; input(&L1);/*输入时请输入有序数据*/ input(&L2);/*输入时请输入有序数据*/ merge(&L1,&L2,&L3);/*合并数据到L3*/ print(&L3);/*输出L3*/}
/*la与lb的交集存放到顺序表lc中*//**********************************//*文件名称:lab1_04.cpp *//**********************************/#include "sequlish.h"void inter(sequence_list *la,sequence_list *lb,sequence_list *lc){ initseqlist(lc); for(int i=0;i<la->size;i++){ int temp=la->a[i]; for(int j=0;j<lb->size;j++) if(temp==lb->a[j]) lc->a[lc->size++]=temp; }}int main(){ sequence_list la,lb,lc; inputfromfile(&la,"1.txt"); /*从文件1.txt建立表*/ inputfromfile(&lb,"2.txt"); /*从文件2.txt建立表*/ print(&la); /*输出la*/ print(&lb); /*输出lb*/ inter(&la,&lb,&lc); /*求la与lb的交集存于lc中*/ print(&lc); /*输出lc*/ return 0;}
/*将顺序表L中的所有奇数调整到表的左边所有偶数调整到表的右边*//**********************************//*文件名称:lab1_05.cpp *//**********************************/#include "sequlish.h"void partion(sequence_list *L){ sequence_list temp; initseqlist(&temp); int left=0,right=L->size-1; for(int i=0; i<L->size; i++){ if(L->a[i]&1) temp.a[left++]=L->a[i]; else temp.a[right--]=L->a[i]; } for(int i=0; i<=left+right; i++) L->a[i]=temp.a[i];}int main(){ sequence_list L; inputfromfile(&L,"3.txt"); print(&L); /*输出表L*/ partion(&L); print(&L); /*输出新表*/ return 0;}
简单入门程序样例
注意:
不管插入删除,都有可能把头结点改变,因此要注意返回链表时候一定要返回链表表头
下面的打印函数很简洁,写着好玩的,可以改写一下容易理解,并且注意循环控制条件
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;struct node{ int age; char a[20]; node *next;};node *creat_list(node *head){ int n; puts("请输入您要输入的元素的个数"); scanf("%d",&n); puts("请输入n个学生的年纪和名字"); node *p1,*p2; int LA=sizeof(node); p1=p2=(node *)malloc(LA); for(int i=1;i<=n;i++){ if(i==1) head=p1; else p2->next=p1; p2=p1; scanf("%d %s",&p1->age,p1->a); p1=(node*)malloc(LA); } free(p1); p2->next=NULL; return head;}void print_list(node *head){ node *p1=head; while(printf("%d %s\n",p1->age,p1->a),(p1=p1->next)!=NULL);}node *dele_elem(node *head){ int pos; puts("请输入您要删除第几个学生的信息"); scanf("%d",&pos); node *p=head; if(pos==1) head=p->next; else{ for(int i=2;i<=pos-1;i++) p=p->next; p->next=(p->next)->next; } return head;}node *insert_elem(node *head){ int pos; puts("请输入您要添加学生信息的位置"); scanf("%d",&pos); node *p=(node *)malloc(sizeof(node)); puts("请输入您要添加学生的年龄和姓名"); scanf("%d%s",&p->age,p->a); node *p1=head; if(pos==1){ head=p; p->next=p1; } else{ for(int i=2;i<=pos-1;i++) p1=p1->next; node *temp=p1->next; p1->next=p; p->next=temp; } return head;}int main(){ //freopen("in.txt","r",stdin); node *head=NULL; head=creat_list(head); print_list(head); head=dele_elem(head); print_list(head); head=insert_elem(head); print_list(head); return 0;}
1 0
- 数据结构试验一 线性表实现 单链表入门
- 数据结构试验二 线性表实现(无头结点)
- [数据结构一]线性表:顺序实现
- 数据结构(一)-----线性表
- (一)数据结构线性表的C++实现
- 数据结构---线性表的链式表示和实现(一)
- (一)数据结构之线性表的简单实现:链表
- (笔记)数据结构2.1-线性表及其实现(一)
- 数据结构笔记一 线性表
- 数据结构复习一:线性表
- 数据结构之线性表一:
- 数据结构之线性表一
- 数据结构(一)---线性表
- 数据结构(一)线性表
- [数据结构]线性表(一)
- 【数据结构】线性表(一)
- 数据结构-线性结构-线性表及其实现
- 数据结构实现顺序线性表
- Android自定义控件
- uva 11461 数学
- POJ2516 Minimum Cost(K次费用流)
- 效率: 条款23 考虑使用其他程序库
- 包管理工具Chocolatey使用方法
- 数据结构试验一 线性表实现 单链表入门
- 测试数据的简单导入
- POJ 3009 Curling 2.0
- java基础篇——异常处理throw与throws的区别
- 打开和关闭mysql服务的两种方法
- RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
- Lua的string函数
- 线程创建方法
- Git使用教程