数据结构试验一 线性表实现 单链表入门

来源:互联网 发布:金牛行情分析软件 编辑:程序博客网 时间: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
原创粉丝点击