#include<iostream> #include<errno.h> using namespace std; //数组实现 /* #define MAXLINES 1000 typedef int elementtype; typedef int position; struct List { elementtype elements[MAXLINES]; position last = 0; }; position End(List L)//返回尾后下标 { return L.last + 1; } void Insert(elementtype x, position p, List L)//所有的插入都是往**之前插 { if (p > MAXLINES - 1) cerr << "list is full"; else { if (p > L.last + 1||p<1) cerr << "position dose not exit";//输出错误的方式 else { for (position q = L.last; q >= p; --q) L.elements[q + 1] = L.elements[q]; L.last += 1; L.elements[p] = x; } } } void Delete(position p, List L) { if (p > MAXLINES - 1) cerr << "list is full"; else { if (p > L.last + 1 || p<1) cerr << "position dose not exit";//输出错误的方式 else { for (position q = p; q < L.last; ++p) L.elements[q] = L.elements[q + 1]; L.last--; } } } position First(List L) { return 1; } position Locate(elementtype x, List L) { for (position q = First(L); q < End(L); ++q) { if (L.elements[q] == x) return q; } return L.last + 1;//x若不存在 } */ //指针实现方式 /* typedef int elementtype; struct node { node* next; elementtype element; }; typedef node* position; //由于每次的插入都是插在之前,所以这里返回的是指向x的前一个指针 position Locate(elementtype x, node* header) { position q = header; while (q->next != NULL) { if (q->next->element == x) return q; else q = q->next; } return q; } //插入操作 void Insert(elementtype x, elementtype p, node* header)//将x插入到值为p的前面,未找到就插在尾后 { position q = Locate(p, header); position temp; temp->element = x; temp->next = q->next; q->next = temp; } //删除操作 void Delete(elementtype p, node* header) { position q = Locate(p, header); if (q->next == NULL) cerr << "can not find the position"; position temp = q->next; q -> next = temp->next; delete temp; } */ //游标实现 /* typedef int elementtype; #define maxsize 1000 struct node { elementtype element; int next; }; node space[maxsize]; int availhead; void Initial() { for (int i = 0; i < maxsize - 1; ++i) { space[i].next = i + 1; } space[maxsize - 1].next = -1; availhead = 0; } int Locate(int M, elementtype x) { int N = M;//无必要,毕竟不是按引用传递 while (space[N].next != -1) { if (space[space[N].next].element == x) return N; } return N; } void Insert(int M, elementtype x)//这里的int就可以直接代表指针,并且如若找不到,直接在末尾后添加 { int N=Locate(x, M); int temp = space[availhead].next; if (temp == -1) cerr << "no avail space"; space[availhead].next = space[temp].next; space[temp].element = x; space[temp].next = space[N].next; space[N].next = temp; } void Delete(int M, elementtype x) { int N = Locate(x, M); if (N == -1) cerr << "can not find the position"; space[N].next = space[space[N].next].next; } */ //双向链表 //该链表无头节点,或者说头节点中也含有信息 //指针实现 /* typedef int elementtype; struct node { node* pre; node* next; elementtype element; }; typedef node* position; typedef node* List; position Locate(elementtype x,List L) { position q = L; while (q->next != NULL) { if (q->element == x) return q; else q = q->next; } return q->next;//注意这里不需要像前面一样返回找到元素的前一个元素,可以直接返回到本来元素 } void Delete(elementtype x, List L)//十分巧妙的删除手法 { position p = Locate(x, L); if (p->pre != NULL)//如果不是首结点 p->pre->next = p->next; if (p->next != NULL)//如果不是尾结点 p->next->pre = p->pre; delete p; } */ //环状链表 //该链表删除添加元素的对象都是位置p之后的一个元素 //同样头结点中蕴含信息 //规定:R为首节点,指向R的为尾节点 typedef int elementtype; struct node { node* next; elementtype element; }; typedef node* position; typedef node* List; position Locate(List L, elementtype x) { position q = L; while (q->next != NULL) { if (q->element == x)//在之后插入 return q; } return q; } void LInsert(List L, elementtype x)//在首端之后插入 { node* temp = new node; temp->element = x; if (L == NULL) { temp->next = temp; L = temp;//形成自环 } else { temp->next = L->next; L->next = temp; } } void RInsert(List L, elementtype x)//在末尾之后插入 { LInsert(L, x); L = L->next;//感觉有点不太好 } void LInsert(List L) { if (L == NULL) cerr << "list is not exict"; else { node* temp = L->next; if (temp == NULL) L = NULL; else { L->next = temp ->next; } delete temp; } }
线性表基本操作
猜你喜欢
转载自blog.csdn.net/qq_36921652/article/details/79481152
今日推荐
周排行