使用C++实现链表的基本操作

来源:互联网 发布:svn server linux下载 编辑:程序博客网 时间:2024/04/30 02:44
#include <stdio.h>#include <iostream>using namespace std;typedef class List{public:int data;List *next;}node;/*单链表的创建无参数,输入任意非0数字创建链表,输入0结束创建返回head头指针存在BUG:第一次输入0时,内存发生错误(已解决,无法打印出head->data的值)*/node *create(){node *head;//头指针node *p;//指示指针,用于记录存入位置node *s;//链表节点int x;int n = 0;//表示链表长度int cycle = 1;head = (node*)malloc(sizeof(node));p = head;while(cycle){cout << "\n请您输入数据:" << endl;cin >> x;if(0 != x)//输入0结束{s = (node*)malloc(sizeof(node));s->data = x;++n;cout << "创建节点" << n<< "成功,您输入的数据为:" << s->data;p->next = s;p = s;}elsecycle = 0;}if(0 != n){head = head->next;p->next = NULL;cout << "链表创建完毕,第一个元素为" << head->data << endl;}else{head->next = NULL;head = NULL;cout << "链表为空" << endl;}return head;}  /*单链表测长传入参数为链表头指针返回链表长度(int)*/int length(node *head){int n = 0;//链表长度node *p;p = head;while(NULL != p){p = p->next;++n;}return n;}/*单链表打印传入参数为链表头指针无返回值*/const void print(node *head){node *p;int n;p = head;n = length(head);cout << "链表中共有" << n << "个元素:" <<endl;if(NULL != head){while(NULL != p){cout << p->data << " ";p = p->next; }}cout <<endl;}/*单链表的删除传入参数1:单链表头指针;参数2:删除节点的数据返回head头指针存在BUG:无法删除头结点(已解决,需要有头指针接收删除后的头指针)*/node *del(node *head, int num){node *p1;node *p2;p1 = head;while(num!=p1->data && NULL!=p1->next){p2 = p1;p1 = p1->next;}if(num == p1->data){if(p1 == head){head = p1->next;free(p1);}elsep2->next = p1->next;}elsecout << "元素" << num << "无法在链表中找到" << endl;return head;}/*单链表的插入(头插法)传入参数1:单链表头指针;参数2:插入节点的数据返回head头指针*/node *insert(node *head ,int num){node *p0;node *p1;node *p2;p1 = head;p0 = (node *)malloc(sizeof(node));p0->data = num;while((p0->data)>(p1->data) && NULL!=p1->next){p2 = p1;p1 = p1->next;}if(p0->data <= p1->data){if(head == p1){p0->next = p1;head = p0;}else{p2->next = p0;p0->next = p1;}}else{p1->next = p0;p0->next = NULL;}return head;}/*单链表的排序传入参数为链表头指针返回值为排序后的链表头指针*/node *sort(node *head){node *p;int n;int temp;n = length(head);if(NULL == head || NULL == head->next)return head;p = head;for(int j = 1;j != n;j++){p = head;for(int i = 0;i != n-j; i++){if((p->data)>(p->next->data)){temp = p->data;p->data = p->next->data;p->next->data = temp;}p = p->next;}}return head;}/*单链表的逆序传入参数为链表头指针返回值为排序后的链表头指针*/node *reverse(node *head){node *p1;node *p2;node *p3;if(NULL == head || NULL == head->next)return head;p1 = head;p2 = p1->next;while(NULL != p2){p3 = p2->next;p2->next = p1;p1 = p2;p2 = p3;}head->next = NULL;head = p1;return head;}void main(void){node *head;int length;int n;head = create();length = ::length(head);cout << "链表长度为:" << length << endl; print(head);cout << "请输入要删除的数字" << endl;cin >> n;head = del(head,n);print(head);cout << "请输入要插入的数字" << endl;cin >> n;head = insert(head,n);print(head);sort(head);cout << "排序后的链表为:" << endl;print(head);head = reverse(head);cout << "倒序后的链表为:" << endl;print(head);}

0 0
原创粉丝点击