当前位置:文档之家› 《数据结构与算法分析》课程设计:顺序表、单链表、顺序栈、查找、排序算法

《数据结构与算法分析》课程设计:顺序表、单链表、顺序栈、查找、排序算法

*******大学《数据结构与算法分析》课程设计题目:数据结构上机试题学生姓名:学号:专业:信息管理与信息系统班级:指导教师:2014年04月目录一、顺序表的操作 (2)【插入操作原理】 (2)【删除操作原理】 (2)【NO.1代码】 (3)【运行截图演示】 (7)二、单链表的操作 (10)【创建操作原理】 (10)【插入操作原理】 (10)【删除操作原理】 (10)【NO.2代码】 (11)【运行截图演示】 (20)三、顺序栈的操作 (25)【数值转换原理】 (25)【NO.3代码】 (26)【运行截图演示】 (30)四、查找算法 (32)【顺序查找原理】 (32)【折半查找原理】 (32)【NO.4代码】 (33)【运行截图演示】 (38)五、排序算法 (40)【直接插入排序原理】 (40)【快速排序原理】 (40)【NO.5代码】 (41)【运行截图演示】 (46)一、顺序表的操作(1)插入元素操作:将新元素x 插入到顺序表a 中第i 个位置;(2)删除元素操作:删除顺序表a 中第i 个元素。

【插入操作原理】线性表的插入操作是指在线性表的第i-1个数据元素和第i 个数据元素之间插入一个新的数据元素,就是要是长度为n 的线性表:()11,,,,,i i n a a a a -…………变成长度为n+1的线性表:()11,,,,,,i i n a a b a a -…………数据元素1i a -和i a 之间的逻辑关系发生了变化。

(其【插入原理】在课本P23的算法2.3有解释)【删除操作原理】反之,线性表的删除操作是使长度为n 的线性表:()111,,,,,,i i i n a a a a a -+…………变成长度为n-1的线性表:()111,,,,,i i n a a a a -+…………数据元素1i a -、i a 和1i a +之间的逻辑关系发生变化,为了在存储结构上放映这个变化,同样需要移动元素。

(其【删除原理】在课本P24的算法2.4有解释)【NO.1代码】#include<stdio.h>#define MAX 100typedef int datatype;typedef struct{datatype data[MAX];int list;}sequenlist; /*顺序表*/int main(){int insert( sequenlist *L, int x, int i );int deletee( sequenlist *L, int i );int input( sequenlist *L );int output( sequenlist *L );sequenlist s,*p=&s;int indata,inlocate,deletedx;input(p);printf( "请输入要插入的数:" ); scanf( "%d",&indata );printf( "请输入要插入的位置:" );scanf( "%d",&inlocate );insert( p,indata,inlocate );printf( "插入后的数据:" );output(p);printf( "请输入要删除的位置:" );scanf( "%d",&deletedx );deletee( p, deletedx );printf( "删除后的数据:" );output(p);return 0;}int output( sequenlist *L ){int i;for( i=0; i<=L->list; i++ )printf( "%d ",L->data[i] );printf( "\n\n" );return(1);}int input( sequenlist *L ) {int i;printf( "请输入原始数据个数:" );scanf( "%d",&( L->list ) );L->list--;printf( "请输入原始数据:" );for( i=0; i <= L->list; i++ )scanf( "%d",&( L->data[i] ) );printf( "原始数据为:" );output(L);return (1);}int insert( sequenlist *L, int x, int i ){int j;if ( ( (*L).list )>=MAX-1 ){printf( "overflow" ); return 0;}else{if ( (i<1) || (i> ( (*L).list )+1 ) ) {printf( "error\n" );return 0;}else{for ( j=L->list;j>=i-1;j-- )L->data[j+1]=L->data[j];L->data[i-1]=x;L->list++;}}return(1);}int deletee( sequenlist *L,int i ) /*定义删除函数*/ {int j;if ( (i<1) || ( i>(L->list)+1 ) ){printf( "error\n" );return 0;}else{for ( j=i;j<=L->list;j++ )L->data[j-1]=L->data[j];L->list--;}return(1);}【运行截图演示】①、如下面的运行截图所示,当输入的线性表长度设置为12的时候,该线性表最多能输入12位数的长度。

输入要插入的数和插入数的位置下标,便可以进行插入操作;同理当输入要执行删除操作数的位置下标,可以将该数删除出线性表。

②、如下面的运行截图所示,当初始设置的线性表长度为5的时候,其5个数分别是-3、4、5、0、1。

若是要执行程序中输入的插入数字“2”,其插入数的位置在“-4”的时候,程序是不能执行插入操作的。

此时的线性表能插入的下标范围为“1——5”,明显“-4”数值<下限“1”数值,所以程序执行“error”。

③、如下面的运行截图所示,同理该线性表要插入数的位置“6”数值>上限“5”数值,所以程序执行“error”。

④、如下面的运行截图所示,初始设置的线性表插入数字2之后,要删除位置7已超过线性表的最大长度n=6,所以程序执行“error”。

⑤、如下面的运行截图所示,同理该线性表要删除数的位置“0”下标不存在,所以程序执行“error”。

二、单链表的操作(1)创建一个带头结点的单链表;(2)插入元素操作:将新元素x 插入到单链表中第i 个元素之后;(3)删除元素操作:删除单链表中值为x 的元素。

【创建操作原理】在单链表的第一个结点之前附设一个结点,称之为头结点。

头结点的数据域可以不存储任何信息,也可以存储线性表的长度等的附加信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。

【插入操作原理】为插入数据元素x ,首先要生成一个数据域为x 的结点,然后插入在单链表中。

根据插入操作的逻辑定义,还需要修改结点a 中的指针域,令其指向结点x ,而结点x 中的指针域应指向结点b ,从而实现3个元素a 、b 和x 之间逻辑关系的变化。

假设s 为指向结点x 的指针,则上述指针修改用语描述即为:s ;next p next ->=-> s p next ->=【删除操作原理】反之,在线性表中删除元素b 时,为在单链表中实现元素a 、b 和c 之间逻辑关系的变化,仅需要修改结点a 中的指针域即可。

假设p 为指向结点a 的指针,则上述指针修改用语描述即为:;p next p next next ->=->->【NO.2代码】#include<stdio.h>#include<malloc.h>typedef struct node //定义链表{int data;struct node *next;}snode;snode* creat() //创建链表的函数{snode *head, *p, *q;head = (snode *)malloc(sizeof(snode));p = head;int x;printf("请输入创建链表的值,用“0”结束输入。

\n"); printf("x = ");scanf("%d", &x);while (x != 0){q = (snode *)malloc(sizeof(snode));q->data = x;p->next = q;p = q;printf("x = ");scanf("%d", &x);}p->next = NULL;return head;}int length(snode *head)//测链表的结点数{int i = 0;snode *p = head->next;while (p != NULL){p = p->next;i++;}return i;}void display(snode *head){snode *p = head->next;for(int i = 0; i < length(head); i++){printf("%4d", p->data);p = p->next;}printf(" ");}int locate(snode *head, int x){snode *p = head->next;int i = 1;while (p != NULL && x != p->data){p = p->next;i++;}if (p == NULL)return 0;elsereturn i;}int insnode(snode *head, int x, int i) //把x插入到链表的第i的位置{int j;snode *p = head->next, *s;if(i < 1 || i > (length(head) + 1))return 0;else if (i == 1){s = (snode *)malloc(sizeof(snode));s->next = p;head->next = s;s->data = x;}else{for (j = 1; j < i - 1; j++)p = p->next;s = (snode *)malloc(sizeof(snode));s->next = p->next;p->next = s;s->data = x;}return 1;}int delnode(snode *head, int i)//删除链表中第i个结点{snode *p = head->next, *q = head;if(i < 1 || i > length(head))return 0;else if (i == 1){head->next = p->next;free(p);}else{for (int j = 1; j < i; j++){p = p->next; q = q->next;}q->next = p->next;free(p);}return 1;}void sort(snode *head) //把链表中每个结点的值按从小到大排列{snode *p, *q;int k;for(p = head->next; p != NULL; p = p->next)for(q = p->next; q != NULL; q = q->next)if (p->data > q->data){k = p->data;p->data = q->data;q->data = k;}}void insert(snode *head, int x) //在有序链表中插入x,插入后仍保持有序{snode *p = head->next, *s, *q = head;while (p != NULL && p->data < x){q = q->next;p = p->next;}s = (snode *)malloc(sizeof(snode));s->next = q->next;s->data = x;q->next = s;}void del_min_max(snode *head, int min, int max) //删除有序链表中值min到值max中的结点{snode *p = head->next, *q = head;while (p != NULL && p->data <= min){q = p;p = p->next;}while (p != NULL && p->data < max){q->next = p->next;free(p);p = q->next;}}void del_min(snode *head){snode *p = head->next, *q = head;snode *p_min, *q_min;p_min = p;q_min = q;while (p != NULL){q = p; p = p->next;if (p != NULL && p->data < p_min->data) {q_min = p_min;p_min = p;}}q_min->next = p_min->next;free(p_min);}int main(){int min, max;snode *headl = creat(); //创建链表printf("最初的链表如下:");display(headl);printf("\n\n");int num, location;printf("请输入您要查找的数:");scanf("%d", &num);if (locate(headl, num))printf("数字%d在链表中的位置为:%d\n\n", num, locate(headl, num));elseprintf("数字%d在链表中不存在!\n\n", num);printf("请分别输入您要插入到链表中的数以及想插入的位置(用空格号间隔开):");scanf("%d %d", &num, &location);if (insnode(headl, num, location)){printf("插入新值以后的链表如下:");display(headl);printf("\n\n");}else printf("输入有误!\n\n");printf("请输入您想删除的结点位置:");scanf("%d", &location);if (delnode(headl, location)){printf("删除第%d个结点后的链表如下:", location); display(headl);printf("\n\n");}elseprintf("输入有误! \n\n");}【运行截图演示】①、如下面的运行截图所示,创建带有头结点且长度为8的单链表:4、8、2、-4、-6、1、9、-1。

相关主题