#include "stdafx.h" #include<iostream> using namespace std; #include<malloc.h> enum Status{OK,ERROR}; typedef int ElemType; typedef struct Lnode { ElemType num; ///结点元素类型为int Lnode *next; ///指向下一结点的指针 }LNode,*LinkList; ///创建n个人序号的链表 Status CreatLink(LinkList &L,int n) { LinkList p; LinkList head; L = (LinkList)malloc(sizeof(LNode));///带头结点的链表 if (L == NULL) { return ERROR; } L->next = L; //构成一个循环链表 head = L; //使head指向L,后面没创建一个节点时就将它放到head的后面,然后在使head指向它。 for (int i = 0; i < n; ++i) { p = (LinkList)malloc(sizeof(LNode));///生成新结点 if (p == NULL) { return ERROR; } p->num = i+1; p->next = L; head->next = p;///尾插法插入新结点 head = p; } return OK; } ///打印链表 Status PrintLink(LinkList L) { LinkList p = L->next; LinkList q; while (p != L) { q = p->next; cout<<" "<<p->num; p = q; } cout<<endl; return OK; } //删除单链表的第i个位置的元素 void insert(LinkList &L,int i,ElemType &e) { LNode *p; int j=1; LinkList node; p=L; while(p->next!=L && j<i) //寻找第i-1个节点 { p=p->next; ++j; } if(p->next==L && j<i) //经过上面while的循环,如果超出边界,那么此时p指针已经指向最后一个节点 { cout<<"插入的位置已经超出边界"<<endl; return; } node = (LinkList) malloc(sizeof(LNode));//创建LNode的节点 node->num=e; node->next = p->next; p->next = node; } ///删除符合要求的结点 Status DelLink(LinkList &L,int n) { int i = 1; LinkList p,q; p=L; while(p->next!=L && i<n) //要删除节点n,先找到节点n-1,当条件退出时指针正好指向n-1 { p=p->next; ++i; } if(p->next==L) { cout<<"没有找到要删除循环单链表的位置:"<<endl; return ERROR; } q = p->next; p->next = q->next; free(q); return OK; } //销毁链表 Status DestroyLink(LinkList &L) { LinkList p = L->next; LinkList q; while (p != L) { q = p->next; free(p); p = q; } free(L); return OK; } int main(int argc,char* argv[]) { int n; ElemType data; LinkList L; cin>>n; CreatLink(L,n); PrintLink(L); cout<<"请输入删除的位置:"; cin>>n; DelLink(L,n); cout<<"请输入要插入元素的位置和数据:"; cin>>n; cin>>data; insert(L,n,data); PrintLink(L); cin>>n; DestroyLink(L); return 0; }
对于单链表和循环单链表而言,最大的区别就是循环单链表的最后一个节点指向了头结点,而单链表最后的一个节点为NULL。
实现时的方法基本一样,唯一不同的是判断条件:
单链表:空 的判断是最后一个节点指针域为NULL。
循环单链表:空 的判断是节点的下一个节点指向本身,也就是只有一个头结点。