数据结构课程设计实验1 4(C语言)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3、部分参考实验代码:
1、结点定义
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}ListNode,*LinkList;
2、单链表初始化
void InitList(LinkList *head)
/*将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置为空。*/
int ListEmpty(DLinkList *L) {
return(L->next==NULL); } int ListLength(DLinkList *L) { DLinkList *p=L;
int i=0; while(p->next!=NULL) {
i++; p=p->next; } return(i); } void DispList(DLinkList *L) { DLinkList *p=L->next; while(p!=NULL) { printf("%c",p->data); p=p->next; } printf("\n"); }
//指向后继结点
} DLinkList;
void InitList(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList));
L->prior=L->next=NULL;
}
void DestroyList(DLinkList *&L)
{
DLinkList *p=L, *q=p->next; while(q!=NULL) { free(p); p=q; q=q->next; } free(p); }
int GetElem(DLinkList *L,int i,ElemType &e) { int j=0;
DLinkList *p=L;
while(j<i&&p!=NULL) { i++;
p=p->next; } if(p==NULL)
return 0; else
e=p->data; return 1; }
L->list[j-1]=L->list[j]; L->length=L->length-1; return 1;
}
实验二 单链表的操作
1、实验目的
1)掌握用 Visual C++6.0 上机调试单链表的基本方法 2)理解链表的基本操作、了解链表的建立和输出 3)掌握链表的插入、删除、合并和归并等实现方法
/*查找线性表中元素值为 e 的元素,查找成功将对应元素的序号返回,否则返回 0 表示失败。
*/
{
ListNode *p;
int i;
if(LBiblioteka BaidustEmpty(head)) /*在查找第 i 个元素之前,判断链表是否为空*/
return 0;
p=head->next; /*指针 p 指向第一个结点*/
实验一 顺序表的操作
1、实验目的和要求:
1)了解顺序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、删除、查找 以及线性表合并)。 2) 通过在 visual C++实现以上操作的 C 语言代码。 3)提前了解实验相关的知识(尤其是 C 语言)。
2、实验内容:
1) 顺序表的插入算法,删除算法,顺序表的合并算法 2) 顺序表应用的实例(二选一) a) 利用顺序表的基本运行,实现如果在顺序表 A 中出现的元素,在顺序表 B 中也出现,则在顺序表 A 中将该元素删除。及实现 A-B。 b) 顺序表 A 和 B 的元素都是非递减排列,将他们合并成一个顺序表 C,要 求 C 也是非递减排列。
int j; if(i<1||i>L->length+1) /*在插入元素前,判断插入位置是否合法*/ {
printf("插入位置 i 不合法!\n"); return -1;
}
else if(L->length>=ListSize)
/*在插入元素前,判断顺序表是否已经满,不能插入元素*/
{
printf("顺序表已满,不能插入元素。\n");
int LocateElem(DLinkList *L,ElemType e) {
int i=1; DLinkList *p=L->next; while(p!=NULL&&p->data!=e) { p=p->next;
i++; } if(p==NULL)
return(0); else
return(i); }
return 1;
}
实验三 双链表的操作
1、目的
理解双链表的基本操作 了解双链表的建立和输出 掌握双链表的插入、删除等实现方法
2、内容和要求 基本要求
编写一个程序,实现双链表的各种基本运算(假设双链表的元素类型为
char),并在此基础上设计一个程序,完成如下功能: (1)初始化双链表 h; (2)采用尾插法依次插入元素 a,b,c,d,e; (3)输出双链表 h; (4)输出双链表 h 长度; (5)判断双链表 h 是否为空; (6)输出双链表 h 的第 3 个元素; (7)输出元素 a 的位置; (8)在第 4 个位置上插入元素 f; (9)输出双链表 h; (10)删除 h 的第 3 个元素; (11)输出双链表 h; (12)释放双链表 h。
{
if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL) /*为头结点分配一个存储空间*/
exit(-1);
(*head)->next=NULL;
/*将单链表的头结点指针域置为空*/
}
ListNode *Get(LinkList head,int i) /*查找单链表中第 i 个结点。查找成功返回该结点的指针表示成功;否则返回 NULL 表示失 败。*/ {
2、实现内容
1、单链表基本操作的实现 2、链表应用的实例(二选一) a) 利用链表的基本运行,实现如果在链表 A 中出现的元素,在链表 B 中也出现, 则在链表 A 中将该元素删除。 b)、约瑟夫(Josephus)问题的求解(循环链表的使用,使用 C 和 C++语言均可)。 假设有编号为 1,2,……,n 的 n 个人围坐成一圈,约定从编号为 k(n>=k>=1) 的人开始报数,数到 m 的那个人出列,他的下一个人从 1 开始重新报数,数到 m 的那个人出列,依次类推,直到所有的人全部出列为止,由此产生一个出队编号 的序列。 1、给定一个 8 个人的圈(n=8),约定从第 3 个人开始报数(k=3),数到第 4 个人时的那个人出列(m=4),使用循环链表,产生一个出队编号的序列。 2、参考的出队序列为:< 6 2 7 4 3 5 1 8 >。
int j;
pre=head;
j=0;
while(pre->next!=NULL&&pre->next->next!=NULL&&j<i-1)/*判断是否找到前驱结点*/
{
pre=pre->next;
j++;
}
if(j!=i-1)
/*如果没找到要删除的结点位置,说明删除位置错误*/
{
printf("删除位置错误");
/*在单链表中第 i 个位置插入一个结点,结点的元素值为 e。插入成功返回 1,失败返回 0*/
{
自己完成
}
int DeleteList(LinkList head,int i,DataType *e)
/*删除单链表中的第 i 个位置的结点。删除成功返回 1,失败返回 0*/
{
ListNode *pre,*p;
{
p=p->next;
j++;
}
if(j==i)
return p;
/*找到第 i 个结点,返回指针 p*/
else
return NULL ;/*如果没有找到第 i 个元素,返回 NULL*/
}
ListNode *LocateElem(LinkList head,DataType e)
/*查找线性表中元素值为 e 的元素,查找成功将对应元素的结点指针返回,否则返回 NULL
i=1;
while(p)
{
if(p->data==e)/*找到与 e 相等的元素,返回该序号*/
return i;
else
{
p=p->next;
i++;
}
}
if(!p)
/*如果没有找到与 e 相等的元素,返回 0,表示失败*/
return 0;
}
int InsertList(LinkList head,int i,DataType e)
return 0;
}
else
{
for(j=L->length;j>=i;j--)/*将第 i 个位置以后的元素依次后移*/
L->list[j]=L->list[j-1];
L->list[i-1]=e;
/*插入元素到第 i 个位置*/
L->length=L->length+1;
/*将顺序表长增 1*/
return 1;
}
}
⑶ 顺序表删除
int DeleteList(SeqList *L,int i,DataType *e) {
int j; if(L->length<=0) {
printf("顺序表已空不能进行删除!\n"); return 0; } else if(i<1||i>L->length) { printf("删除位置不合适!\n"); return -1; } else { *e=L->list[i-1]; for(j=i;j<=L->length-1;j++)
表示失败。*/
{
ListNode *p;
p=head->next; /*指针 p 指向第一个结点*/
while(p)
{
if(p->data!=e) /*找到与 e 相等的元素,返回该序号*/
p=p->next;
else
break;
}
return p;
}
int LocatePos(LinkList head,DataType e)
#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct DNode //定义双链表结点类型
{
ElemType data;
struct DNode *prior; //指向前驱结点
struct DNode *next;
return 0;
}
/*指针 p 指向单链表中的第 i 个结点,并将该结点的数据域值赋值给 e*/
p=pre->next;
*e=p->data;
/*将前驱结点的指针域指向要删除结点的下一个结点,也就是将 p 指向的结点与单链表
断开*/
pre->next=p->next;
free(p);
/*释放 p 指向的结点*/
3、部分参考实验代码:
⑴ 顺序表结构的定义: #include <stdio.h> #define ListSize 100 typedef int DataType; typedef struct {
DataType list[ListSize]; int length; }SeqList;
⑵ 顺序表插入(在第 i 号元素前插入一个新的元素) int InsertList(SeqList *L,int i,DataType e) /*在顺序表的第 i 个位置插入元素 e,插入成功返回 1,如果插入位置不合 法返回-1,顺序表满返回 0*/ {
int ListInsert(DLinkList *&L,int i,ElemType e) { }
int ListDelete(DLinkList *&L,int i,ElemType &e) { }
. void main() {
DLinkList *h; ElemType e;
printf("双链表的基本运算如下:\n"); printf(" (1)初始化双链表 h\n"); InitList(h); printf(" (2)依次采用尾插法插入 a,b,c,d,e 元素\n"); ListInsert(h,1,'a'); ListInsert(h,2,'b'); ListInsert(h,3,'c'); ListInsert(h,4,'d'); ListInsert(h,5,'e'); printf(" (3)输出双链表 h:"); DispList(h); printf(" (4)双链表 h 长度=%d\n",ListLength(h)); printf(" (5)双链表 h 为%s\n",(ListEmpty(h)?"空":"非空")); GetElem(h,3,e); printf(" (6)双链表 h 的第 3 个元素=%c\n",e); printf(" (7)元素 a 的位置=%d\n",LocateElem(h,'a')); printf(" (8)在第 4 个元素位置上插入 f 元素\n"); ListInsert(h,4,'f'); printf(" (9)输出双链表 h:"); DispList(h); printf(" (10)删除 h 的第 3 个元素\n"); ListDelete(h,3,e); printf(" (11)输出双链表 h:"); DispList(h); printf(" (12)释放双链表 h\n"); DestroyList(h); }
ListNode *p;
int j;
if(ListEmpty(head)) /*在查找第 i 个元素之前,判断链表是否为空*/
return NULL;
if(i<1)
/*在查找第 i 个元素之前,判断该序号是否合法*/
return NULL;
j=0;
p=head;
while(p->next!=NULL&&j<i)
相关文档
最新文档