链表的表示与实现
#include<iostream.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define OK 1 #define OVERFLOW -2 #define ERROR 0 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList_L(LinkList &L) { //构造一个空的链表 L=new LNode; if(!L) exit(OVERFLOW); L->next=NULL; return OK; }//InitList_L void ListCreate_L(LinkList &L,int n) { //创建链表 尾插法 ElemType x; LNode *p; cout<<"input x(n)="<<endl; for(int i=n;i>0;--i) { p=new LNode; if(!p) exit(OVERFLOW); cin>>x; p->data=x; p->next=L->next;L->next=p; } }//ListCreate_L Status GetElem_L(LinkList L,int i,ElemType &e) { //L是带头结点的链表的头指针,以e返回第i个元素 LNode *p; int j; p=L->next; j=1; //p指向第一个结点,j为计数器 while(p && j<i) { p=p->next; ++j; } //顺指针向后查找,直到p指向第i个元素,或p为空 if(!p || j>i) return ERROR; //第i个元素不存在 e=p->data; //取得第i个元素 return OK; }//GetElem_L Status ListInsert_L(LinkList &L,int i,ElemType e) { //L为带头结点的单链表的头指针,本算法 //在链表中第i个结点之前插入新的元素 e LNode *p,*q; int j; p=L; j=0; while(p && j<i-1) { p=p->next; ++j; } //寻找第i-1个结点 if(!p || j>i-1) return ERROR; //i大于表长或者小于1 q=new LNode; //生成新结点 q->data=e; q->next=p->next; p->next=q; //插入 return OK; }//LinstInsert_L Status ListDelete_L(LinkList &L,int i,ElemType &e) { //删除以L为头指针(带头结点)的单链表中第i个结点 LNode *p,*q; int j; p=L; j=0; while(p->next && j<i-1) { p=p->next; ++j; } //寻找第i个结点,并令p指向其前趋 if(!(p->next) || j>i-1) return ERROR; //删除位置不合理 q=p->next; p->next=q->next; //删除并释放结点 e=q->data; delete q; return OK; }//ListDelete_L void visit_L(LinkList L) { LNode *p=L->next; while(p) { cout<<p->data<<" "; p=p->next; } cout<<endl; } void main() { LinkList L; ElemType x; int i,n; InitList_L(L); cout<<"input LinkList n="; cin>>n; ListCreate_L(L,n); visit_L(L); cout<<"input getElem i="; cin>>i; if(GetElem_L(L,i,x)) cout<<x<<endl; else cout<<"GetElem i error!\n"; cout<<"input insert i,x="; cin>>i>>x; if(ListInsert_L(L,i,x)) visit_L(L); else cout<<"Insert i error!\n"; cout<<"input delete i="; cin>>i; if(ListDelete_L(L,i,x)) { cout<<"Delete Elem is"<<x<<endl; visit_L(L); } else cout<<"Delete i error!\n"; }