/*要求:实现单链表的各种基本算法 添加:插入和销毁 作者:ys 日期:16.10.13 添加日期:10.17,10.18*/
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<iostream> using namespace std;
#define maxsize 50; typedef char ElemType; typedef struct LNode//定义单链表结点类型 { ElemType data; struct LNode *next; }Linklist;
/*实现单链表的各种基本运算的算法 1、初始化 2、输入 3、插入 4、输出即显示 5、求长度 6、判断是否为空 7、输出第i位置的元素 8、查找一个给定元素在表中的位置 9、删除 10、释放单链表 0、退出*/
void Initlist(Linklist *&L);//初始化链表函数的声明 bool Inputlist(Linklist *L);//输入函数的声明 void Insertlist(Linklist *&L);//插入函数的声明 void Dislist(Linklist *L);//输出函数的声明 int Listlength(Linklist *L);//求长度函数的声明 bool Listempty(Linklist *L);//判空函数的声明 bool Getelem(Linklist *L);//求值函数的声明 void LocateElem(Linklist *L);//查找函数的声明 bool Delectlist(Linklist *&L);//删除函数的声明 bool Destroylist(Linklist *&L);//销毁函数的声明
void main() { //1、变量的定义: int n;//操作数 Linklist *H; int len;//求长度的值 bool i;//求值的返还类型
//2、菜单 for(;;) { printf("单链表的基本操作如下:\n"); printf("1、初始化\t"); printf("2、输入\n"); printf("3、插入 \t"); printf("4、输出\n"); printf("5、求长度 \t"); printf("6、判空\n"); printf("7、求值 \t"); printf("8、查找\n"); printf("9、删除 \t"); printf("10、销毁 \t"); printf("0、退出\n"); printf("请选择操作步骤: "); scanf("%d",&n); switch(n) { case 1: printf("执行初始化操作!\n"); Initlist(H); break; case 2: printf("执行链表的输入!\n"); Inputlist(H); break; case 3: printf("执行链表的插入!\n"); Insertlist(H); Dislist(H); break; case 4: printf("执行链表的输出!\n"); Dislist(H); break; case 5: printf("执行链表的求长度!\n"); len = Listlength(H); printf("链表的长度为:%d\n",len); break; case 6: printf("执行链表的判空!\n"); printf("该链表为%s!\n",Listempty(H)?"空":"非空"); break; case 7: printf("执行链表的求值!\n"); i = Getelem(H); if(i == false) { printf("取值失败!请输入%d以内的值\n",Listlength(H)); } break; case 8: printf("执行链表的查找!\n"); LocateElem(H); break; case 9: printf("执行链表的删除!\n"); Delectlist(H); break; case 10: printf("执行链表的释放!\n"); Destroylist(H); break; case 0: exit(0); } } }
void Initlist(Linklist *&L)//1.初始化链表的定义 { L = (Linklist *)malloc(sizeof(Linklist)); L->next = NULL; }
bool Inputlist(Linklist *L)//2.输入函数的定义 { Linklist *s; Linklist *p; p = L; int i; i = 0; printf("请输入个数:\n"); int n; cin>>n; if(L == NULL) return false; while(i < n) { s = (Linklist *)malloc(sizeof(Linklist)); printf("请输入链表的第%d个元素",i+1); cin>>s->data; p->next = s;//头指针为空 s->next = NULL; p = p->next; i++; } return true; }
//L为指向链表的指针,n为插入的逻辑位置 void Insertlist(Linklist *&L)//3.插入函数的定义 { Linklist *p = L; int i; i = 1;//循环变量初始化
int n; printf("请输入插入元素的逻辑位置:"); scanf("%d",&n); if(n < 1 || n > Listlength(L))//判断loc是否合法 { printf("取值失败!请输入%d以内的值\n",Listlength(L)); } else if(p == NULL); else { Linklist *s = (Linklist *)malloc(sizeof(Linklist)); printf("请输入插入的元素:"); cin>>s->data;
while(i < n && p != NULL)//*p指向n位置 { p = p->next; i++; } if(p->next == NULL) { p->next = s; s->next = NULL; } else { s->next = p->next; p->next = s; } } }
void Dislist(Linklist *L)//4.输出函数的定义 { Linklist *p; p = L->next; printf("链表的全部元素如下:\n");
while(p != NULL) { cout<<p->data<<" "; p = p->next; } cout<<endl; }
int Listlength(Linklist *L)//5.求长度函数的定义 { int len; len = 0; Linklist *p = L; while(p->next != NULL) { len++; p = p->next; } return len; }
bool Listempty(Linklist *L)//6.判空函数的定义 { return (L->next == L); }
bool Getelem(Linklist *L)//7.求值函数的定义 { int loc; printf("请输入要取值的逻辑位置:\n"); scanf("%d",&loc); if(loc < 1 || loc > Listlength(L))//判断loc是否合法 { return false; } Linklist *p = L; int i = 0; while(i < loc && p->next != NULL) { p = p->next; i++; } cout<<"第"<<loc<<"个元素的值为:"<<p->data<<endl; return true; }
//注:L的头指针为空,返回值为其他表示查到了 void LocateElem(Linklist *L)//8.查找函数的定义 { Linklist *p = L; int loc; printf("请输入要查找第几个元素:\n"); scanf("%d",&loc);//输入需查寻的逻辑位置 if(loc > Listlength(L)) { printf("输入不合法,查找失败!"); } else { int i; i = 0; while(i < loc) { p = p->next; i++; } cout<<"元素为:"<<p->data<<endl; } }
//删除返回true bool Delectlist(Linklist *&L)//删除函数的定义 { Linklist *pre = L; Linklist *p = L->next; printf("请输入删除的逻辑位置:"); int n; scanf("%d",&n); int i = 1; while(i < n &&pre != NULL)//找到n个节点 { i++; pre = pre->next; } if(p == NULL) return false; else { p = pre->next; if(p == NULL) return false; pre->next = p->next; free(p); return true; } /*if(pre->next != NULL) { while(i < n && pre != NULL) { p = p->next; i++; } } if(p->next = NULL) { free(p); pre->next = NULL; return true; } else { pre = p; p = p->next; pre->next = p->next; free(p); return true; }*/ }
bool Destroylist(Linklist *&L)//10.销毁函数的定义 { Linklist *pre = L; Linklist *p = pre->next; while(p != NULL) { free(pre); pre = p; p = p->next; } free(pre); return 1; }
新手入门,不知道怎么将它写入文件,并且读出来。
很纠结一个问题,输入链表的数据是写在分函数好呢,还是主函数好呢?为什么?
