实验名称:实验一单链表的基本操作实验目的熟练掌握线性表两类存储结构的描述方法。
实验内容从键盘读入若干个整数,建一个整数单链表,并完成下列操作:(1)打印该链表;(2)在链表中插入一个结点,结点的数据域从键盘读入,打印该链表;(3)在链表中删除一个结点,被删结点的位置从键盘读入,打印该链表;(4)在链表中做查找:从键盘读入要查找的整数,将该整数在链表中的位置打印出来,若要查找的整数不在链表中,返回一个信息。
算法设计分析(一)数据结构的定义单链表存储结构定义为:struct Node;typedef struct Node * pnode;struct Node {int info;pnode link;};typedef struct Node * LinkList;(二)总体设计程序由主函数、创建单链表函数、链表长度函数、链表打印函数、插入正整数函数、删除函数、查询函数组成。
其功能描述如下:(1)主函数:调用各个函数以实现相应功能int main(void) //主函数{printf("单链表的基本操作实验:\n");struct list *pnode;pnode = creat(); //创建print(pnode); //输出insert(pnode); //插入print(pnode); //输出_delete(pnode); //删除print(pnode); //输出_located(pnode); //查找print(pnode); //输出return 0 ;}(三)各函数的详细设计:Function1: struct list *creat()//创建链表;(1):申请表头节点空间(2):输入-1结束输入;(3):结点的数据域从键盘读入;Function2:void print(struct list *pnode)//打印链表;(1):利用while循环输出结点的数据域;Function3:void insert(struct list *pnode)//插入;(1):定义一个整型变量flag 记录当前指定插入的位置;(2):利用if条件判断念输入的位置是否有效;//If(position <=0||position>length(pnode))//当输入的位置小于0或者大于链表的长度时,继续输入,直到输入到正确的值为止;(3):申请一个结点空间(为即将插入的节点);(4):用q->info 记录插入节点的数据域;(5):用while(flag!=position)判断插入的位置;(6):if(t == pnode->next) 判断插入的位置是否为单链表头结点的后面;如果是,直接用q->next = pnode->next;pnode->next = q;return ;插入结点;Function4:void _delete(struct list *pnode)//删除;(1):用if(position<=0||position>length(pnode)) 判断输入删除的位置是否在允许的范围<0或>点链表的总长度,则重新输入;(2):while(flag!=position&&p->next!=NULL) 找到需要删除的位置;(3):找到要删除的结点后,把要删除的结点架空,即可删除该结点;Fubction5:void _located(struct list *pnode)//查询位置上的数;Function6:void _located(struct list *pnode)//查询数值所在表的位置;(1):找到要查询数值的位置while(flag!=number){p=p->next;flag=p->info;position++;}(2):若未找到相关数值,则返回not found!if(!p){printf("not found");}实验测试结果及结果分析(一)测试结果(二)结果分析(1)单链表:1 2 3 4 5 6(2)输入插入的位置为:9,显示无效插入位置(3)重新输入插入位置3,输入插入值:7,则返回单链表,1 2 7 3 4 5 6(4)输入删除的位置:8,显示无效删除位置(5)从新输入删除位置:4;则返回单链表1 2 7 4 5 6(5)输入查询数值:3;则返回该数值在单链表中的位置:7实验总结通过本次的实验我对单链表有了更加深刻的了解,对单链表的删除,插入,打印,查找,等基本的操作有基本的掌握。
同事通过自己的多次测试和修改程序代码,明白了许多在之前比较模糊的知识点。
附录实验程序代码#include<stdio.h>#include<stdlib.h>#define N 30struct list //表结构{int info;struct list *next;};//链表创建struct list *creat(){int value; //值(正整数)struct list *pnode,*p,*q;pnode = (struct list *)malloc(sizeof(struct list) * N); q = pnode;printf("输入一个正整数(输入-1退出)"); scanf("%d",&value);while(value>0) //大于0时循环{p=(struct list *)malloc(sizeof(struct list) );p->info= value;q->next = p;q = p;printf("继续输入正整数(输入-1退出):");scanf("%d",&value);}q->next = NULL;return pnode;}//链表长度int length(struct list *pnode){int _length = 0;struct list *p;p = pnode->next;while(p!=NULL){_length++;p=p->next;}return _length;}//链表打印void print(struct list *pnode){struct list *p;p = pnode->next;while(p!=NULL){printf("%d ",p->info);p=p->next;}printf("\n");}//插入void insert(struct list *pnode){struct list *p,*q,*t;int position;int insert_value;int flag = 1; //记录当前是否位于指定插入的位置p = t =pnode->next;printf("输入插入位置:");loop: //语句标号scanf("%d",&position);if(position<=0||position>length(pnode)){printf("无效插入位置!,重新输入:");goto lop;o}printf("输入插入值:");scanf("%d",&insert_value);q=(struct list *)malloc(sizeof(struct list));q->info = insert_value;while(flag!=position) //{t = p;flag++;p=p->next;}if(t == pnode->next){q->next = pnode->next;pnode->next = q;return;}q->next = t->next;t->next = q;}//删除void _delete(struct list *pnode){struct list *p,*t; //表结构int flag = 0; //同插入标头int position; //position位置p = t = pnode;printf("输入删除位置:");loop: //语句标号scanf("%d",&position);if(position<=0||position>length(pnode)) //length{printf("无效删除位置!,重新输入:");goto loop;}while(flag!=position&&p->next!=NULL){t = p;flag++;p=p->next;}t->next = p->next;free(p);}//查询void _located(struct list * pnode){struct list *p,*t;int flag = 0; //同插入int position; //position --位置p = t = pnode;printf("输入查询位置:");//读取一个正确的查询数字loop: //语句标号scanf("%d",&position);if(position<=0||position>length(pnode)) //length长度position 位置{printf("无效查询位置!,重新输入:");goto loop;}while(flag!=position){flag++;p=p->next;}printf("查找的值是:%d\n",p->info);}int main(void) //主函数{printf("单链表的基本操作实验:\n"); struct list *pnode;pnode = creat(); //创建print(pnode); //输出insert(pnode); //插入print(pnode); //输出_delete(pnode); //删除print(pnode); //输出_located(pnode); //查找print(pnode); //输出return 0 ;}。