数据结构2.2--线性表的链式实现
2016-03-17 00:00
381 查看
摘要: 存取增删o(n),物理地址不一定相邻
//linkList.h #pragma once #ifndef _LINK_LIST #define _LINK_LIST typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; #define OK 1 #define ERROR 0 //创建线性表(链表) int createList(LinkList &, int); //获取线性表中的元素 int getElem(LinkList, int, int &); //向线性表中插入元素 int listInsert(LinkList &, int, int); //删除线性表中的元素 int listDel(LinkList &, int, int &); //合并两张线性表 int mergeList(LinkList &, LinkList &, LinkList &); #endif // !1 //linkList.cpp #include "linkList.h" #include <cstdlib> //创建线性表(链表) int createList(LinkList &L, int n) { L = (LinkList)malloc(sizeof(LNode)); //创建头结点 L->next = 0; for (int i = 0; i < n; ++i) { LNode *p = (LinkList)malloc(sizeof(LNode)); //创建新节点 p->data = i; p->next = L->next; L->next = p; } return OK; } //获取线性表中的元素 int getElem(LinkList L, int i, int &nElem) { LNode *p = L->next; int j = 1; //计数器 //在节点不为空的前提下后移指针 while (p && j < i) { p = p->next; ++j; } //第i个数不存在 if (!p || j > i) return ERROR; nElem = p->data; return OK; } //向线性表中插入元素 int listInsert(LinkList &L, int i, int nElem) { LNode *p = L; int j = 0; //计数器 while (p && j < i - 1) { p = p->next; ++j; } //i小于1或者大于表长加1 if (!p || j > i - 1) return ERROR; LNode *s = (LinkList)malloc(sizeof(LNode)); //生成新指针 s->data = nElem; //创建新节点 s->next = p->next; p->next = s; return OK; } //删除线性表中的元素 int listDel(LinkList &L, int i, int &nElem) { LNode *p = L; int j = 0; //计数器 //查找i节点 while (p->next && j < i - 1) { p = p->next; ++j; } //删除的位置不合理 if (!(p->next) || j > i - 1) return ERROR; LNode *q = (LinkList)malloc(sizeof(LNode)); q = p->next; p->next = q->next; nElem = q->data; free(q); return OK; } //合并两张线性表 int mergeList(LinkList &Ll, LinkList &Lr, LinkList &Ld) { LNode *pl = (LinkList)malloc(sizeof(LNode)); LNode *pr = (LinkList)malloc(sizeof(LNode)); LNode *pd = (LinkList)malloc(sizeof(LNode)); pl = Ll->next; pr = Lr->next; //Ll的头结点作为目标线性表的头结点 Ld = pd = Ll; while (pl && pr) { if (pl->data <= pr->data) { pd->next = pl; pd = pl; pl = pl->next; } else { pd->next = pr; pd = pr; pr = pr->next; } } //合并剩余字段 pd->next = pl ? pl : pr; free(Lr); return OK; } //main.cpp #include <iostream> #include "linkList.h" #include <cstdlib> int main() { using std::cout; using std::endl; srand(NULL); int n = rand() % 15; //创建线性表 cout << "创建线性表" << endl; LinkList L; createList(L, n); //样例输出 for (LNode *p = L->next; p != NULL; p = p->next) cout << p->data << " "; cout << endl; cout << "添加数据" << endl; listInsert(L, n + 1, n + 1); //样例输出 for (LNode *p = L->next; p != NULL; p = p->next) cout << p->data << " "; cout << endl; cout << "删除数据" << endl; int nDelElem = 0; listDel(L, n - 1, nDelElem); //样例输出 for (LNode *p = L->next; p != NULL; p = p->next) cout << p->data << " "; cout << endl; cout << "合并线性表" << endl; LinkList Ll, Lr, Ld; createList(Ll, n); createList(Lr, n); mergeList(Ll, Lr, Ld); //样例输出 for (LNode *p = Ld->next; p != NULL; p = p->next) cout << p->data << " "; cout << endl; system("pause"); return 0; }