数据结构上机实验报告(共23页).doc
《数据结构上机实验报告(共23页).doc》由会员分享,可在线阅读,更多相关《数据结构上机实验报告(共23页).doc(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数据结构实验报告一顺序表要求:实现顺序表的初始化、在指定位置插入和删除元素。 算法思路:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。顺序表的初始化操作就是为顺序表分配一个预定义大小的空间,并将线性表的当前长度设为“0”。线性表的插入操作是在线性表的第i-1个数据元素和第i个元素之间插入新的数据元素,使得长度为n的线性表变成长度为n+1的线性表,而删除恰好相反长度变为n-1的线性表,而且删除点后面的元素要往前移动一个位。程序代码:#include #include #define MAXSIZE 50typedef char elemtype
2、;typedef 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) /输出
3、顺序表 int i; printf(此表为:n); for(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-
4、1=x; L-last+; PrintL(L); Length(L);void Delete(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);P
5、rintL(L); Length(L) ; printf(n); printf(请输入你想插入的元素及其位置:n);scanf(%s %d,&b,&j);insert(L,j,b);printf(请输入你想删除的位置:n);scanf(%d,&k);Delete(L,k); 程序运行:二 单链表要求:实现单链表的初始化、在指定位置插入和删除元素。算法思路:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。因此,为了表现每个元素与后继元素的逻辑关系需要用到指针。单链表的插入就是先生成一个数据域为插入元素的界点然后插入单链表中,并且修改前后节点的指针域,完成插入操作。反之删除链
6、表元素时仅需修改前后两个元素的节点使之相连便可。程序代码:#define NULL 0#include stdlib.h#includestdio.htypedef struct LNode intdata; struct LNode*next; LNode, *LinkList;void CreateList_L( LinkList *L);void ShowList(LinkList *L);LNode *GetElem(LinkList head);void InsertList(LinkList *head);void DeleteList(LinkList head);void ma
7、in() LNode *L; int j,loop=1; printf(n); while(loop)printf(1.建立单链表n); printf(2.在单链表插入元素n); printf(3.删除单链表元素n); printf(请选择序号(1-3): ); scanf(%d,&j); switch(j) case 1: CreateList_L(&L);break; case 2: InsertList(&L); break; case 3: DeleteList(L); break;printf(结束此程序吗?(0结束 1继续):n); scanf(%d,&loop);printf(n
8、);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)-next;(*L)-next=p; ShowList(L); void ShowList(LinkList *L)LinkLi
9、st 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 & jnext; j+;s=(LNode *)malloc(sizeof(LNode);s-data=x;s-next=pre
10、-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(&head);程序运行:三 链表的合并要求:给定的2个有序线性链表的合并(合并到1个新的链表中以及合并到其中的1个链表中两种方式)。算
11、法思路:先创建两个有序线性链表a,b。然后将两个有序线性链表a,b合并到a或者h中,得运用指针分别指向a,b当前待比较插入的节点,最后将两个链表的元素有序归并到表a或者h中。程序代码:#include#include#include#include#define L sizeof(struct Node)struct Node long int number; struct Node *next;struct Node *create(int a) int n; struct Node *p1, *p2, *head; head = NULL; n = 0; p2 = p1 = (struct
12、 Node *) malloc(L); scanf(%ld, &p1-number); while (a) n = n + 1; if (n = 1) head = p1; else p2-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 != N
13、ULL) do printf(%ld, p-number); printf( ); p = p-next; while (p != NULL); printf(n);struct Node * inter_link(struct Node * chain1, 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; t
14、emp = a, a = b, b = temp; pos = head; while (p2 != 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
15、-number = (p-next)-number; (p-next)-number = t; p = p-next; p = k; int main() struct Node *p1, *p2; int a; int b; int h; printf(请输入第一个链表:n); printf(n输入链表的长度a:n); scanf(%d, &a); printf(请输入链表数据:); p1 = create(a); printf(n你刚才输入的第一个链表信息:n ); print(p1); printf(n 请输入第二个链表:n); printf(n输入链表的长度b:n); scanf(%d
16、, &b); printf(请输入链表数据:); p2 = create(b); printf(n你刚才输入的第二个链表的信息:n); print(p2); 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;程序运行:四 双向链表要求:实现双向链表的初始化、在指定位置插入和删除元素。 算法思路:因为单链表的节点
17、中只有一个指示直接后继的指针域,因此只能从某节点出发顺指针往后寻查其它节点,若需寻查节点的直接前趋,则需从表头指针出发。所以在双向链表节点中有两个指针域,一个指向后继,一个指向前趋。程序代码:#include#include#define ERROR 0#define OK 1typedef int Elemtype; typedef struct myNode Elemtype data;struct myNode *prior,*next;Node;Node * InitList()Node *H;H=(Node *)malloc(sizeof(Node);if(!H)return ERR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 实验 报告 23
限制150内