1.实验名称
线性表的基本操作及应用
2.实验目的
(1)掌握单链表的创建,插入、删除、查找和打印算法;
(2)运用线性表解决线性结构问题。
3.实验内容
基本要求:
(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除
(4)实现单链表的查找;(5)实现单链表的显示;
选作内容:
两个线性表合并算法的实现。已知顺序表LA和LB中的数据元素按值非递减有序排列,现要将LA和LB归并为一个新的顺序表LC,且LC中的数据元素仍按值非递减有序排序。例如:LA=(3,5,8,11) LB=(2,6,9,15,20)。
实验代码(线性表的基本操作):
#include<stdio.h> #include<stdlib.h> #define OK 1 #define FALSE 0 typedef int Status; typedef float ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LNode,* LinkList; LinkList s,r,P; Status i; //创建单链表 尾插法 void CreatListTail(LinkList &L,Status n) { r=L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=1;i<=n;++i) { s=(LinkList)malloc(sizeof(LNode)); scanf("%f",&s->data); s->next=NULL; r->next=s; r=s; } } //查找 ElemType GetElem(LinkList &L,Status i) { i=i+1; LinkList P; Status j; P=L; j=1; while(P&&j<i) { P=P->next; j++; } return P->data; } //插入 ElemType ListInsert(LinkList &L,int i,ElemType e) { i=i+1; Status j; P=L; j=1; while(P&&j<i-1) { P=P->next; ++j; } if(!P||j>i-1) { return FALSE; } s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=P->next; P->next=s; return OK; } //打印 void print(LinkList &L) { printf("打印单链表:"); LinkList P; P=L->next; while(P!=NULL) { printf("%.2f ",P->data); P=P->next; } printf("\n"); } //删除 Status ListDelete(LinkList &L,int i) { i=i+1; ElemType e; Status j; LinkList q; P=L; j=1; while(P->next&&j<i-1) { P=P->next; j++; } if(!(P->next)||j>i-1) { return FALSE; } q=P->next; P->next=q->next; e=q->data; free(q); return e; } //菜单 menu(LinkList L) { printf(" 欢迎您使用单链表操作系统 \n"); printf("\n"); printf("*************************************************\n"); printf("*1: 打印单链表 *\n"); printf("-------------------------------------------------\n"); printf("*2: 查找单链表中某个位置的元素 *\n"); printf("-------------------------------------------------\n"); printf("*3: 在单链表中插入元素 *\n"); printf("-------------------------------------------------\n"); printf("*4: 在单链表中删除元素 *\n"); printf("*************************************************\n"); Status val,n,i; ElemType e; printf("\n"); printf("请按下相应数字进行选择:"); scanf("%d",&val); switch(val) { case 1:print(L); break; case 2: printf("请输入需要查找元素的位置:"); scanf("%d",&n); printf("获取第%d个元素的值为:%.2f\n",n,GetElem(L,n)); break; case 3: printf("请输入需要插入的值:"); scanf("%f",&e); printf("请输入插入的位置:"); scanf("%d",&i); ListInsert(L,i,e); print(L); break; case 4:printf("请输删除的节点位置:"); scanf("%d",&i); ListDelete(L,i); print(L); break; } } int main() { Status n,i,j,k; LinkList L,P; printf("请输入节点个数:"); scanf("%d",&n); printf("创建单链表(输入每个结点的数据域):"); CreatListTail(L,n); for(j=0;j<100;j++) { printf("是否执行程序(1代表继续执行,0代表终止执行)\n"); scanf("%d",&k); if(k==1) { menu(L); } else { break; } } return 0; }
控制台: