1、单链表问题实验报告名称: 实验目的:1掌握单向链表的存储特点及其实现。2掌握单向链表的插入、删除算法及其应用算法的程序实现实验报告(实验内容、实验步骤、实验运行结果分析、实验小结)实验内容:1键盘输入一组元素,建立一个带头结点的单向链表(无序)。2遍历单向链表。3把单向链表中元素逆置(不允许申请新的结点空间)。4在单向链表中删除所有的偶数元素结点。5编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。6利用算法5 建立两个非递减有序单向链表,然后合并成一个非递增链表。7利用算法5 建立两个非递减有序单向链表,然后合并成一个非递减链表。8利用算法1
2、建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。* 9采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。10在主函数中设计一个简单的菜单,分别调试上述算法。#include #include #include /*构建结点结构体 */typedef struct LNode int data; struct LNode * next;LNode, * LinkList;/*用于创建链表的函数 */*反序构建的*/LinkList CreateList_L(LinkList L, int n) int i; LinkList p;
3、 L = (LinkList)malloc(sizeof(LNode); L-next = NULL; for(i = n; i 0; -i) p = (LinkList)malloc(sizeof(LNode); scanf(%d,&p-data); p-next = L-next; L-next = p; return L;int ListLength_L(LinkList L) LinkList p; int i=0; p = L-next; while(p) i+; p=p-next; return i;/* 用于插入结点的函数 */LinkList ListInsert_L(Link
4、List L, int i, int newnode) LinkList p = L; LinkList s; int j = 0; while(p&jnext; +j; if(!p|ji-1) printf(位置小于1或大于表长。n); return L; s = (LinkList)malloc(sizeof(LNode); s-data = newnode; s-next = p-next; p-next = s; return L;/* 用于删除结点的函数 */LinkList ListDelete_L(LinkList L, int i) LinkList p = L; LinkLi
5、st s; int j=0; while(p-next&jnext; +j; if(!(p-next)|ji-1) printf(删除位置不合理。n); return L; s = p-next; p-next = s-next; printf(%s%dn,被删除的结点是:,s-data); free(s); return L;LinkList GetListElem_L(LinkList L, int i,int *flag,int *elem) LinkList p = L; LinkList s; int j=0; while(p-next&jnext; +j; if(!(p-next)
6、|ji-1) *flag=0; return L; s = p-next; *flag=1; *elem=s-data; return L;/*用于遍历链表的函数 */void ListDisp_L(LinkList L) LinkList p; int i=0; p = L-next; printf(该表中元素分别为:); while(p) printf(%4d, p-data); p = p-next;+i; /* 选择排序算法 */LinkList ListSort_L(LinkList L) LinkList h1,p,q,r,s; h1=p=(LinkList)malloc(size
7、of(LinkList); p-next=L; while(p-next) q=p-next; r=p; while(q-next) if(q-next-data next-data) r=q; q=q-next; if(r!=p) s=r-next; r-next=s-next; s-next=p-next; p-next=s; p=p-next; L=h1-next; free(h1); return L;int getoptions() int opt; printf(1: 建立链表n); printf(2: 显示链表n); printf(3: 插入结点n); printf(4: 删除结
8、点n); printf(5: 返回链表的长度n); printf(6: 返回指定结点n); printf(7: 将链表进行排序n); printf(0: 退出n); printf(输入选项并按回车确认:); scanf(%d,&opt); return opt;int main(int argc, char* argv) int opt; int where; int value; int count; int tag; LinkList L; while(1) opt = getoptions(); if(opt = 1) printf(请输入链表初始结点数:); scanf(%d,&cou
9、nt); printf(请输入各个结点数值,每输入一个按回车确认:n); L = CreateList_L(L, count); ListDisp_L(L); system(PAUSE); continue; if(opt = 2) ListDisp_L(L); system(PAUSE); continue; if(opt = 3) ListDisp_L(L); printf(请输入插入位置:); scanf(%d, &where); printf(请输入要插入的数值:); scanf(%d, &value); L = ListInsert_L(L,where,value); ListDis
10、p_L(L); system(PAUSE); continue; if(opt = 4) ListDisp_L(L); printf(请输入要删除的位置:); scanf(%d,&where); L = ListDelete_L(L,where); ListDisp_L(L); system(PAUSE); continue; if(opt = 7) L = ListSort_L(L); ListDisp_L(L); system(PAUSE); continue; if(opt = 5) ListDisp_L(L); printf(线性表的长度是:%dn,ListLength_L(L); system(PAUSE); continue; if(opt = 6) printf(请输入要查找的元素位置:); scanf(%d,&where); L = GetListElem_L(L,where,&tag,&value); if(tag=1) printf(你要查找的元素是:%dn,value); else printf(输入的查找元素位置不合理。n); system(PAUSE); continue; if(opt = 0) return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1