单链表的插入和删除实验报告
一、 目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。
二、 要求:
建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。
三、 实验内容:
1、分析、理解程序。
程序的主要功能是实现对数据域为字符串的单链表的建立、查找、删除、插入和浏览。 其中链表的建立为头插入法。 链表建立示意图: (a)、删除hat:
(b)、插入charu:
2、修改程序:
1) 增加插入结点的功能。
如在jat后插入charu,程序运行结果为:
2) 将建立链表的方法改为头插入法。
程序源代码:
===================main.cpp=====================
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <ctype.h> #include "linkList.h"
void main() { char ch[10],num[10],ch1[10];
}
L=CreateList(); //用尾插入法建立单链表,返回头指针 PrintList(L); //遍历链表输出其值
printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点 scanf("%s",num);
if(strcmp(num,"y")==0 || strcmp(num,"Y")==0) { }
printf("the position after:"); scanf("%s",ch1);
InsertList(L,ch1); PrintList(L);
FreeAll(L); //删除所有结点,释放内存
printf("Please input Delete_data:");
scanf("%s",ch); //输入要删除的字符串 DeleteList(L,ch); PrintList(L);
===================linkList.cpp=====================
#include "linkList.h" #include <stdlib.h> #include <string.h> #include <stdio.h> #include <ctype.h>
//==========用尾插入法建立带头结点的单链表============
LinkList CreateList()
}
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
LinkList LocateNode(LinkList L,ElemType key) {
LNode *p;
p=L->next; //从开始结点比较
while(p&&strcmp(p->data,key)!=0) //直到p为NULL或p-> data为key止
p=p->next; //扫描下一个结点 while(strcmp(key,"#")!=0) {
t=LocateNode(L,key);
if(t==NULL) { s=(LinkList)malloc(sizeof(LNode));
strcpy(s->data,key); s->next=r->next;
ElemType key; LNode *r,*s,*t;
LinkList L=(LinkList)malloc(sizeof(LNode));//生成头结点 r=L;
r->next=NULL;
printf("Input # to end\n"); //输入“#”代表输入结束 printf("Please input LNode data:\n"); scanf("%s",key);
r->next=s; }
printf("Please input LNode data:\n"); scanf("%s",key);
}
return L;
return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点 }
//==========删除带头结点的单链表中的指定结点=======
void DeleteList(LinkList L,ElemType key) { LNode *p,*r,*q=L;
p=LocateNode(L,key); //按key值查找结点的
if(p==NULL )
{ }
//若没有找到结点,退出
printf("position error"); exit(0);
while(q->next!=p) //p为要删除的结点,q为p的前结点 q=q->next;
r=q->next; q->next=r->next;
free(r); //释放结点 }
//==========插入元素到带头结点的单链表中的指定结点前=======
void InsertList(LinkList L,ElemType key) { ElemType input;
LNode *s,*r;
printf("input the Insert_data:"); scanf("%s",input);
r=LocateNode(L,key);
s=(LinkList)malloc(sizeof(LNode));
strcpy(s->data,input);
s->next=r->next; r->next=s; }
//===========在屏幕上输出所有节点元素==========
void PrintList(LinkList L) { LNode *p=L->next; }
//==========删除所有结点,释放空间===========
void FreeAll(LinkList L) { LNode *r,*p=L; }
while(p->next) { r=p->next; free(p); p=r; }
free(p); while(p) { }
printf("\n");
printf("%s, ",p->data); p=p->next;
===================commom.h=====================
#ifndef _COMM_H_ #define _COMM_H_
#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2
typedef int Status;
#endif
===================linkList.h=====================
#ifndef _LINK_LIST_H_ #define _LINK_LIST_H_
#include "common.h"
typedef char ElemType[10];
typedef struct LNode{
ElemType data; //数据域 struct LNode *next; //指针域
}LNode, *LinkList;
LinkList CreateList();
LinkList LocateNode(LinkList L,ElemType key); void DeleteList(LinkList L,ElemType key); void InsertList(LinkList L,ElemType key); void PrintList(LinkList L); void FreeAll(LinkList L); #endif
实验结果:
调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 输入数据(bat,cat,eat,fat,hat,jat,lat,mat,#) 程序运行结果:
如删除hat程序运行结果为:
…… 此处隐藏:1335字,全部文档内容请下载后查看。喜欢就下载吧 ……