数据结构上机实验报告.docx
《数据结构上机实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构上机实验报告.docx(22页珍藏版)》请在三一办公上搜索。
1、数据结构实验报告一.顺序表要求:实现顺序表的初始化、在指定位置插入和删除元素。算法思路:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元 素。顺序表的初始化操作就是为顺序表分配一个预定义大小的空间,并将线性表的当前长度设 为“0”。线性表的插入操作是在线性表的第i-1个数据元素和第i个元素之间插入新的数据元 素,使得长度为n的线性表变成长度为n+1的线性表,而删除恰好相反长度变为n-1的线性表, 而且删除点后面的元素要往前移动一个位。程序代码:#include #include #define MAXSIZE 50typedef char elemtype;typedef
2、struct类型定义 elemtype vMAXSIZE;int last;SeqList;SeqList *Init_SeqList()初始化操作SeqList *L;L=(SeqList*)malloc(sizeof(SeqList);L-last=-1;return L;void Create(SeqList *L)建立顺序表int i=0;elemtype ch;scanf(%c”,&ch);while(ch!=n)L-vi+=ch;scanf(%c”,&ch);L-last=i-1;void PrintL(SeqList *L)输出顺序表int i;printf(此表为:n);for
3、(i=0;ilast;i+)printf(%c”,L-vi);printf(%cn,L-vi);void Length(SeqList *L)顺序表长度函数printf(此表长度:n%d,L-last+1);printf(n);void insert(SeqList *L,int i,elemtype x)插入函数int j;if(L-last=0)printf(Error!n);if(iL-last)printf(Error!);for(j=L-last;j=i-1;j-)L-vj+1=L-vj;L-vi-1=x;L-last+;PrintL(L);Length(L);void Delete
4、(SeqList *L,int i)删除函数int j;if(L-last=-1)printf(Error!);if(iL-last+1)printf(Error!);for(j=i;jlast;j+)L-vj-1=L-vj;L-last-;PrintL(L);Length(L);void main()程序主函数int i,j,k;elemtype a,b;SeqList *L;L=Init_SeqList();printf(建立顺序表:n);Create(L);PrintL(L);Length(L);printf(n);printf(请输入你想插入的元素及其位置:n);scanf(%s %d
5、”,&b,&j);insert(L,j,b);printf(-请输入你想删除的位置:n);scanf(%d”,&k);Delete(L,k);程序运行: C: Lfsen5s-eliDes kto p II 色序表王 3_.ejce建立顺序表至L23455&此表为:123455&此表长度:7M输入你想插入的元素及其位置:7此表为=L234575&此表长度:请1输云你想删除的位置:此表为:L234576此表长度:章按任意键继续_ _ _二单链表要求:实现单链表的初始化、在指定位置插入和删除元素。算法思路:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。 因此,为了表现每个元
6、素与后继元素的逻辑关系需要用到指针。单链表的插入就是先生成一 个数据域为插入元素的界点然后插入单链表中,并且修改前后节点的指针域,完成插入操作。 反之删除链表元素时仅需修改前后两个元素的节点使之相连便可。程序代码:#define NULL 0#include stdlib.h#includestdio.h”typedef struct LNodeint data;struct LNode *next; LNode, *LinkList;void CreateList_L( LinkList *L);void ShowList(LinkList *L);LNode *GetElem(LinkLi
7、st head);void InsertList(LinkList *head);void DeleteList(LinkList head);void main()LNode *L;int j,loop=1;printf(n);while(loop)printf(1.建立单链表n);printf(2.在单链表插入元素/);printf(3.删除单链表元素/);printf(请选择序号(1-3):);scanf(%d”,&j);switch(j)case 1:CreateList_L(&L);break;case 2:InsertList(&L);break;case 3:DeleteList
8、(L);break;printf(结束此程序吗? (0结束1继续):n); scanf(%d”,&loop);printf(n);void CreateList_L( LinkList *L)( LNode *p;int flag=1;(*L)=(LinkList)malloc(sizeof(LNode);(*L)-next=NULL;printf(请输入链表元素(输0结束):n);while(flag)p=(LinkList)malloc(sizeof(LNode);p-next=NULL;scanf(%d”,&p-data);if (p-data=0) break;p-next=(*L)-
9、next;(*L)-next=p;ShowList(L);void ShowList(LinkList *L)LinkList p;printf(头节点- ”);for(p=(*L)-next;p!=NULL;p=p-next)printf(%d - ,p-data);printf(NULL !n);void InsertList(LinkList *head)LNode *pre,*s;int i,j,x;printf(-请输入插入位置:”);scanf(%d”,&i);printf(请输入插入元素:,scanf(%d”,&x);pre=*head;j=0;while (pre!=NULL
10、& jnext; j+;s=(LNode *)malloc(sizeof(LNode);s-data=x;s-next=pre-next;pre-next=s;ShowList(head);printf(n);void DeleteList(LinkList head)(LNode *pre,*r;int i,j;pre=head;printf(请输入删除位置:”); scanf(%d”,&i);j=0;/*查找第i-1个结点*/ while(pre-next!=NULL & jnext; j+; r=pre-next;pre-next=r-next ;free(r);ShowList(&he
11、ad);程序运行:建立.学链表.在箜链表插入兀素 匚叩柬皂链表元素 ,-选母序号: 1 谱输元素【输a结束h3-n点一44 - 33 - 22 - 此程序吗? (8结束在箪链表插入元素 叩怜堕链表元素擒入插入位置2 捶兀插;A元 44 - 22NULL ?1 继续):结束此崖序吗? (3苗束1继续):建立单链表.在翠肆茬断 A空素链茬兀素选十圣序号(1-3)上逊幡位粉点一,44 - 33 - 22 - W此程序吗?(3结束MULL i 继续):三.链表的合并要求:给定的2个有序线性链表的合并(合并到1个新的链表中以及合并到其中的1个链表 中两种方式)。算法思路:先创建两个有序线性链表a,b。然
12、后将两个有序线性链表a,b合并到a或者h 中,得运用指针分别指向a,b当前待比较插入的节点,最后将两个链表的元素有序归并到 表a或者h中。程序代码:#include#include#include#include#define L sizeof(struct Node)struct Nodelong int number;struct Node *next;;struct Node *create(int a)int n;struct Node *p1, *p2, *head;head = NULL;n = 0;p2 = p1 = (struct Node *) malloc(L);scanf
13、(%ld”, &p1-number);while (a)n = n + 1;if (n = 1)head = p1;elsep2-next = p1;p2 = p1;p1 = (struct Node *) malloc(L);if (a != 1)scanf(%ld”, &p1-number);a-;p2-next = NULL;return (head);void print(struct Node *head)struct Node *p;p = head;printf(数字:n);if (head != NULL)doprintf(%ld”, p-number);printf( );p
14、 = p-next; while (p != NULL);printf(n);struct Node * inter_link(struct Node * chainl, int a, struct Node * chain2, int b) ( int temp;struct Node *head, *p1, *p2, *pos;if (a = b) (head = p1 = chain1;p2 = chain2; else/*ba*/ (head = p1 = chain2;p2 = chain1;temp = a, a = b, b = temp;pos = head;while (p2
15、 != NULL) (p1 = p1-next;pos-next = p2;pos = p2;p2 = p2-next;pos-next = p1;pos = p1;return head;void InsertSort(struct Node *p, int m)int i, j, t;struct Node *k;k = p;for (i = 0; i m - 1; i+) for (j = 0; j number (p-next)-number) t = p-number;p-number = (p-next)-number;(p-next)-number = t;p = p-next;
16、p = k;int main()struct Node *p1, *p2;int a;int b;int h;printf(请输入第一个链表:n);printf(n输入链表的长度a:n);scanf(%d”, &a);printfC请输入链表数据:”);pl = create(a);printf(-n你刚才输入的第一个链表信息:n );print(pl);printf(n请输入第二个链表:n);printf(n输入链表的长度b:n);scanf(%d”, &b);printfC请输入链表数据:);p2 = create(b);printf(-n你刚才输入的第二个链表的信息:n);print(p
17、2);p1 = inter_link(p1, a, p2, b);h = a + b;a = h;print(p1);InsertSort(p1, h);InsertSort(p1, a);printf(n排序后的链表a:n);print(p1);printf(n排序后的链表h:n);print(p1);return 0;程序运行:请输入第一个链君 输入链表的长度盐请输入链表数据;123134145蜚里输入的第一个槌表信息;123134145请输入第二个链表; 卜人链表的长度队 清输入链表数据! iii 143 245部于; ill143数字:123ill245134143姓后的链费ill12
18、3134143屐后的链表把ill123134143请按任意键继续- 瞄地才输入的第二个措表的信息;145245145245145245四双向链表要求:实现双向链表的初始化、在指定位置插入和删除元素。算法思路:因为单链表的节点中只有一个指示直接后继的指针域,因此只能从某节点出发顺 指针往后寻查其它节点,若需寻查节点的直接前趋,则需从表头指针出发。所以在双向链表 节点中有两个指针域,一个指向后继,一个指向前趋。程序代码:#include#include#define ERROR 0#define OK 1typedef int Elemtype;typedef struct myNodeElemt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 实验 报告

链接地址:https://www.31ppt.com/p-5306571.html