#include<iostream> using namespace std; /* 学习算法主要是掌握学习方法。学习步骤: 记清数据结构——因为所有的算法都是基于数据元素+结构的操作。 写算法时,先用自然语言注释函数,并写清步骤。然后再翻译成程序语言。 最后,对算法进行简要的复杂度分析。 养成这种学习算法的习惯,对算法的理解和书写将有很大帮助,长远来看,省时和高效。 */ #define ELEMTYPE int //宏定义 typedef struct linkNode//定义数据元素的结构 { ELEMTYPE data; struct linkNode* next; }linkNode; typedef linkNode* linklist; /*初始化链表,也就是分配一个内存给头节点,并初始化*/ void initLinkList(linklist& L) { L = new linkNode; L->next = NULL; } /*收回链表所占内存*/ void destroyLinkList(linklist L) { linklist p = L; linklist q =NULL; while (p!=NULL)// { q = p->next; delete p; p = q; } p =NULL; q =NULL; L =NULL; } /*清除所有的元素,只留下头节点*/ void clearLinkList(linklist L) { linklist p = L->next; linklist q = NULL; while (p!= NULL) { q = p->next; delete p ; p = q; } q =NULL; p =NULL; L =NULL; } /*添加元素,并返回插入元素的地址*/ linklist addElemLinkList(linklist L, ELEMTYPE x) { /* LIST OF THE PROCEDURE: 为新数据分配内存,并赋值 把新数据元素链接到链表中 */ //为新数据元素分配内存,并初始化 linklist p = new linkNode; p->data = x; p->next = NULL; //把新数据元素链接到链表中 linklist q = L; while (q->next!=NULL)//找到链表尾 { q = q->next; } //插入数据元素 q->next = p; return p;//返回数据元素的位置 } /*在指定的链表位置,插入元素,并返回插入元素的位置*/ linklist insertElemLinkList(linklist L, int num ,ELEMTYPE x) { /* LIST OF THE PROCEDURE: 判断参数的合法性 为新元素分配内存,并赋值 找到插入位置 插入元素,并返回插入位置 */ //判断元素的合法性 if (num <1) { cout<<"插入位置不合法"; return NULL; } //为新元素分配内存 linklist k =new linkNode; k->data = x; k->next = NULL; //寻找插入位置 linklist p = L; int i =1; linklist q = p->next; while (p != NULL) { if (i >=num) { k->next = p->next; p->next = k; return k; } p = q; if (q !=NULL) { q = q->next; } i++; } return k; } /*确定元素位置,并返回位置*/ int locateElem(linklist L, ELEMTYPE x) { linklist p = L->next; int i =0; while (p != NULL) { i++; if (x ==p->data) { return i; } p= p->next; } return i; } /*删除数据元素*/ ELEMTYPE deleteElem(linklist L, int num) { linklist p = L->next; linklist q = L; int i =0; ELEMTYPE x = NULL; while (p!= NULL) { i++; if (i ==num ) { q->next = p->next; x =p->data; delete p; return x; } q =p; p= p->next; } return x; } /*求链表的长度*/ int getLength(linklist L) { linklist p = L->next; int i =0; while (p != NULL) { i++; p= p->next; } return i; } /*输出所有元素*/ void display(linklist L) { linklist p = L->next; while (p !=NULL) { cout<<p->data<<endl; p= p->next; } } void main() { linklist L = NULL; //初始化链表 initLinkList(L); //添加元素 int i=0; for (i=1; i <10; i++ ) { addElemLinkList(L,i); } //在指定位置,插入元素 insertElemLinkList(L, 11, 1); //输出链表长 cout<<"length: "<<getLength(L) <<endl; cout<<"第9 个元素位置为:"<< locateElem(L, 9)<<endl; //删除元素 deleteElem(L,1); //输出链表中元素 display(L); //销毁链表 destroyLinkList(L); }