第二章 单链表
- /*****************************SqList**********************************
- Date:2008.10.23
- Author:ZORO
- WebSite:http://blog.csdn.net/sevenhu
- ======================================================================
- 参考资料:
- BOOK:数据结构(C语言版) 严蔚敏 清华大学出版社
- Page:37
- ======================================================================
- ADT LinkList {
- InitList(&L)
- DestroyList(&L)
- ListAdd(&L,q)
- LocateElem(L,data,&i)
- ListInsert(&L, i, data)
- ListDelete(&L, i)
- ListTraverse(L)
- }ADT LinkList
- ======================================================================
- note:VC++ 6.0测试通过。
- *********************************************************************/
- #include <iostream>
- #define OK 1
- #define ERROR 0
- #define NULL 0
- #define FALSE 0
- using namespace std;
- typedef int Status;
- typedef struct LNode{ //结点类型
- int data;
- struct LNode * next;
- }LNode, *Link;
- typedef struct { //链表类型
- Link head,tail; //链表头结点和尾结点
- int len; //链表长度
- }LinkList;
- Status MakeNode(Link &p, int data)
- {
- //新建结点
- Link q = (Link)malloc(sizeof(LNode));
- if (!q) { //分配空间失败
- return ERROR;
- }
- q ->data = data;
- q ->next = NULL;
- p = q;
- q = NULL; //q不再有用
- return OK;
- }//MakeNode
- Status InitList(LinkList &L)
- {
- //初始化链表
- L.head = NULL;
- L.tail = NULL;
- L.len = 0;
- return OK;
- }//InitList
- Status ClearList(LinkList &L)
- {
- //清空链表并释放空间
- Link p,q;
- p = L.head ;
- q = p->next ;
- while (q){ //循环释放
- free(p);
- p = q;
- q = p->next ;
- }
- free(p);
- p = q = NULL;
- L.head = NULL;
- L.tail = NULL;
- L.len = 0;
- return OK;
- }//ClearList
- Status DestroyList(LinkList &L)
- {
- //销毁表
- ClearList(L);
- return OK;
- }//DestroyList
- Status InsHead(LinkList &L, Link &s)
- {
- //插入头结点
- if (!s) {
- return ERROR;
- }
- Link h = L.head ;
- L.head = s;
- s->next = h;
- ++L.len ;
- return OK;
- }//InsHead
- Status DelHead(LinkList &L)
- {
- //删除头结点
- Link p = L.head ;
- L.head = p->next ; //修改L表中的头结点
- --L.len ;
- free(p);
- p = NULL;
- return OK;
- }//DelHead
- Status ListDel(LinkList &L, int i)
- {
- //在L表中删除第i个元素
- if (i > L.len || i < 1) {
- return ERROR;
- }
- if (i == 1) { //如果删除第一个元素
- DelHead(L);
- return OK;
- }
- Link q = L.head;
- if (i == L.len ) { //如果删除最后一个元素
- while (q->next->next) {
- q = q->next ;
- }
- free(q->next) ;
- L.tail = q; //修改L表中的尾结点
- q->next = NULL; //尾结点的指针域为空
- --L.len ;
- return OK;
- }
- Link p;
- for (int j = 0; j < i-1; ++j) { //判断元素位置
- p = q;
- q = q->next ;
- }
- p->next = q->next ; //删除元素
- --L.len ;
- free(q);
- return OK;
- }//ListDel
- Status ListTraverse(LinkList L)
- {
- //遍历单链表
- Link p = L.head ;
- while (p) {
- cout << p->data << " "; //输出元素,并移向下一个元素
- p = p->next ;
- }
- cout << endl << "共" << L.len << "个元素!" << endl; //输出链表长度
- return OK;
- }//ListTraverse
- Status ListAdd(LinkList &L, Link q)
- {
- //增加元素
- if (!L.head) { //第一个元素
- L.head = q;
- L.tail = q;
- }
- else { //不是第一个元素
- Link p1 = L.head ;
- Link p2;
- while (p1) {
- p2 = p1;
- p1 = p1->next ;
- }
- p2->next = q;
- L.tail = q;
- }
- ++L.len; //加表长
- return OK;
- }//ListAdd
- Status ListIns(LinkList &L, int i, int data)
- {
- //在i个位置之前插入元素data,不能插在表的最后,如果插入最后请用ListAdd函数
- if (i > L.len || i < 1) { //判断i值的合法性
- return ERROR;
- }
- Link q;
- MakeNode(q,data); //给元素data创建一个新结点,并分配空间
- if (i == 1) { //如果在第一个位置插入
- InsHead(L,q); //调用插入头结点函数
- return OK;
- }
- Link p = L.head ;
- for (int j = 0; j < i-2; ++j) { //判断位置
- p = p->next ;
- }
- q ->next = p->next ; //插入操作
- p ->next = q;
- ++L.len ; //加表长
- return OK;
- }//ListIns
- Status LocateList(LinkList L, int data, int &i)
- {
- //查找与data相等的值,由i返回位置
- Link p = L.head ;
- i = 0;
- while (p) {
- ++i;
- if (p->data == data) { //查找
- return OK;
- }
- p = p->next ;
- }
- i = -1; //如果没有找到,位置为-1
- return FALSE;
- }//LocateList
- int main()
- {
- //测试数据
- LinkList L;
- Link q;
- InitList(L);
- for (int i = 0; i < 10; ++i) {
- MakeNode(q,i);
- ListAdd(L,q);
- }
- ListTraverse(L);
- cout << "在第9个位置插入100" << endl;
- ListIns(L,9,100);
- // ListIns(L,1,99);
- cout << "成功插入!" << endl;
- ListTraverse(L);
- cout << "删除第五个元素!" << endl;
- ListDel(L,11);
- ListTraverse(L);
- int index;
- LocateList(L,8,index);
- cout << "数字8在链表的第" << index << "个元素!" << endl;
- if (DestroyList(L) == OK) cout << "OK" << endl;
- return 0;
- }