// linklist.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdlib.h> #include <stdio.h> //单链表的实现 typedef int DataType; typedef struct node { DataType data; struct node *link; }LinkNode,*LinkList; //初试化链表,创建表头 bool InitList( LinkList &first ) { first = new LinkNode(); if(first == NULL) return false; first->link = NULL; return true; } //清除链表 void ClearList( LinkList &first) { LinkList p; while(first->link != NULL) { p = first->link; first->link = p->link; delete p; } } //求链表的长度 int Length( LinkList &first) { int count =0; LinkList p = first->link; while( p != NULL) { p = p->link; count++; } return count; } //查找链表元素 LinkList Search(LinkList &first, DataType x) { LinkList p = first->link; while( p != NULL ) { if( p->data == x)return p; p = p->link; } return p; } //定位元素位置 LinkList Locate(LinkList &first,int i) { if( i < 0 ) return NULL; LinkList p = first; int k = 0; while( p != NULL && k < i ) { p = p->link; k++; } return p; } //在第I个位置插入元素X bool Insert( LinkList &first, int i, DataType x ) { LinkList p = Locate(first, i-1); if( p == NULL ) return false; LinkList q = new LinkNode(); if( q == NULL ) return false; q->data = x; q->link = p->link; p->link = q; return true; } //前插法 bool InsertFront( LinkList &first, DataType x ) { if( first == NULL )return false; LinkList p = new LinkNode(); if( p == NULL ) return false; p->link = first->link; p->data = x; first->link = p; return true; } //尾插法 bool InsertRear( LinkList &first, DataType x ) { if( first == NULL ) return false; LinkList p = first->link; if( p == NULL ) return InsertFront( first, x ); while( p != NULL) { if( p->link == NULL ) break; p = p->link; } LinkList q = new LinkNode(); if( q == NULL ) return false; q->data = x; q->link = NULL; p->link = q; return true; } //删除元素 bool Remove( LinkList &first, int i) { LinkList p = Locate( first,i-1); if( p == NULL || p->link == NULL )return false; LinkList q = p->link; p->link = q->link; delete q; return true; } //输出链表 void Output( LinkList &first) { LinkList p = first->link; int count = 1; while( p != NULL ) { printf("第%d个元素是%d\n",count,p->data); p = p->link; count++; } } //链表倒置 //比如头结点0 链表结构0 - 1 -2 -3 -4 -5 //算法解释,把包括2后面的节点依次插到头节点后面,然后注意连接节点指向link指针就行了 //pre 先只向第二个节点, 每一次循环都把先pre放到first节点后面,然后修改pre值 使其指向下一轮 //第一轮 2放到0-1之间。先1要指向3 2指向头节点下一个节点,然后头节点指向2,之后修改pre使其指向3,在轮训。第一轮结束排序结果 //0 - 2- 1 -3 -4 -5 //第二轮结果: //0 - 3 -2 -1 -4 -5 void Invert( LinkList &first ) { LinkList p,pre; p=first->link; pre=p->link; while(pre){ p->link=pre->link; pre->link=first->link; first->link=pre; pre=p->link; } } int _tmain(int argc, _TCHAR* argv[]) { LinkList first; if(!InitList(first)) { printf("init list failed\n"); } Insert( first, 1, 1); Insert( first, 2, 2); Insert( first, 3, 3); Insert( first, 4, 4); Insert( first, 5, 5); Insert( first, 6, 6); Insert( first, 7, 7); Insert( first, 8, 8); Insert( first, 9, 9); Insert( first, 10, 10); Insert( first, 11, 11); Invert( first ); /* InsertRear( first, 1 ); InsertRear( first, 2 ); InsertRear( first, 3 ); InsertRear( first, 4 ); InsertRear( first, 5 ); InsertRear( first, 6 ); InsertRear( first, 7 ); InsertRear( first, 8 ); InsertFront( first, 0 ); */ Output(first); getchar(); return 0; }