单链表的实现-功能完善

来源:互联网 发布:杭州电魂网络 编辑:程序博客网 时间:2024/05/21 22:58
初学数据结构和算法,使用的c++语言。

单链表的实现,主要是在尾指针那块卡了一下下,尾指针的操作还是要仔细,否则指向不明内存,引发程序崩溃。

希望对初学者有点用,主要还是自己加深印象。

//单链表#include <iostream>#include <MATH.H>#define OK      1#define ERROR  -1using namespace std;//链表存储结构typedef struct node{int data;              //数据域struct node* p_next;   //指针域}node,*Linklist;Linklist p_head;  //头指针//初始化链表void InitList(Linklist & L){L = new node;if(!L)exit(OVERFLOW);L->p_next =NULL;}//链表长度int Linklistlen(Linklist  L){node * p = L->p_next;int len = 0;while(p!=NULL){len++;p = p->p_next;}return len;}//按序号查找node* InSearch_Pos(Linklist L,int pos)     //传入要查在的位置序号{node * p =L->p_next;int count = 1;while(p!=NULL && count<pos){count++;p = p->p_next;}if( pos == count)return p;elsereturn NULL;}//按值查找node* InSearch_Data(Linklist L,int data)   //传入要查找的值{node * p ;p = L->p_next;while(p!=NULL&&p->data!=data)p = p->p_next;if(p!=NULL&&p->data == data)return p;elsereturn NULL;}//插入操作int LinkInsert(Linklist & L, int data, int pos)   //插入数据到链表的指定位置{node * p , * s;p = InSearch_Pos(L,pos-1);              //找到要插入位置的前一个位置if(p==NULL)return ERROR;s = new node;if(s == NULL)return ERROR;s->data = data;s->p_next = p->p_next;                  //插入新节点,注意顺序,小心链表断掉p->p_next = s;return OK;}//删除操作int LinkDelete(Linklist & L, int pos){node * p = InSearch_Pos(L,pos-1);if(p==NULL)return ERROR;node * q = p->p_next;p->p_next = q->p_next;delete q;q = NULL;                                //防止内存泄漏return OK;}//销毁链表void LinkDestroy(Linklist & L){node * p;while(L->p_next!=NULL){p = L->p_next;L->p_next = p->p_next;delete p;p = NULL;}}//显示链表void LinkShow(Linklist L){node * p ;// while(p!=NULL)                         // {// cout<<p->data<<"  ";// p = p->p_next;// }for(p = L->p_next; p!=NULL ;p =p->p_next)cout<<p->data <<"  ";cout <<endl;}//头插法void Add_head(Linklist &L,int data){node * p;p = new node;p->data = data;p->p_next = L->p_next;L->p_next = p;}//尾插法void Add_tail(Linklist &L, int data) //每次输入一个数据,传入{node * p , * r;r = L;p = new node;p->data = data;p->p_next = NULL;while(r->p_next)             //循环找到链表尾部r= r->p_next;r->p_next = p;}// void Add_tail(Linklist &L, int n) //每次输入n个数据,键盘输入// {// node * p, * r;// r = L;// for(int i = 0; i<n ; i++)// {// p = new node;// cout << "请输入数据:";// cin >> p->data;//         p->p_next = NULL;    // r->p_next = p;// r = p;               //尾指针指向链表尾端// }// }int main(){cout << "\t - - - - - -测试 - - - - - -"<< endl;InitList(p_head);cout << "采用头插法为空表添加5个值."<<endl;Add_head(p_head,1);Add_head(p_head,2);Add_head(p_head,3);Add_head(p_head,4);Add_head(p_head,5);cout <<"插入前链表为:"<<endl;;LinkShow(p_head);cout <<"在第二个位置和第四个位置插入两个数据10和11:" <<endl;LinkInsert(p_head,10,2);LinkInsert(p_head,11,4);LinkShow(p_head);cout << "此时链表的长度为:";cout << Linklistlen(p_head)<<endl;cout <<"- - - - - - - - - - - - - - - - - - - -"<<endl;cout << "采用尾插法为已有链表增加两个值6和7:"<<endl;Add_tail(p_head,6);Add_tail(p_head,7);LinkShow(p_head);cout << "此时链表的长度为:";cout << Linklistlen(p_head)<<endl;return 0;}



1 0
原创粉丝点击