/ADT
// data {a1, a2, a3... ,an}
// operation
// InitList(*L) 初始化链表,建立一个空的链表
// ListEmpty(L) 若链表为空,返回true,否则返回false
// ClearList(*L) 将线性表清空
// GetElem(L, i, *e) 将链表L 的i位置的元素返回e
// LocateElem(L, e) 在链表L 找到与e相等的元素,成功返回1,否则返回0
// ListInsert(*L, i, e) 在链表L第i个位置插入新元素e
// ListDelete(*L, i, *e)删除链表L 第i 个位置元素e,并返回它的值
// Listlength(L) 返回链表的长度
/endADT
// Data 2012 12 18 oujiayao point to list
/
# include <iostream>
# include <ctime>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}NODE,*Linklist;
//typedef struct Node *Linklist;
void InitList(Linklist *L)
{
*L = (NODE*)malloc(sizeof(NODE));
if(NULL == L)
cout << "不能分配内存。" << endl;
else
(*L)->next = NULL;
}
bool ListEmpty(Linklist L)
{
if(NULL == L->next)
return false;
else
return true;
}
void CreateList(Linklist *L, int i)
{
//头插法
//每个节点都要分配内存
/*int j;
srand(time(0));
Linklist p;
*L = (NODE *)malloc(sizeof(NODE));
if(NULL == L)
exit(0);
(*L)->next = NULL;
for(j=1; j<=i; j++)
{
p = (NODE*)malloc(sizeof(NODE));
p->data = rand()%100 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
*/
//尾插法
Linklist r,p;
int j;
srand(time(0));
*L = (NODE*)malloc(sizeof(NODE));
if(NULL == L)
exit(0);
(*L)->next = NULL;
r = *L;
for(j=1; j<=i; j++)
{
p = (NODE*)malloc(sizeof(NODE));
p->data = rand()%10 +0;
r->next = p;
r = p;
}
r->next = NULL;
}
void ListInsert(Linklist *L, int pos, int elem)
{
int j = 1;
Linklist p, s;
p = *L; //不能使(*L)->next因为他不指向下一个节点顺序会错误的
while(p && j<pos)
{
p = p->next;
j++;
}
s = (NODE*)malloc(sizeof(NODE));
if(NULL == s)
exit(0);
s->data = elem;
s->next = p->next;
p->next = s;
}
void ListDelete(Linklist *L, int pos)
{
int j = 1, elem;
Linklist p, q;
p = *L;
while(p && j<pos)
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
elem = q->data;
free(q);
}
int Listlength(Linklist L)
{
int count = 0;
Linklist p;
p = L->next;
while(p)
{
p=p->next;
count++;
}
return count;
}
int LocateElem(Linklist L, int pos)
{
int j=1;
Linklist p;
p = L->next;
while(p && j<pos)
{
p = p->next;
j++;
}
return p->data;
}
//删除链表的时候 声明两个节点 没有p有数据域和指针域 这两个的free后 要提前保存下一个节点的位置 才可以
void ClearList(Linklist *L)
{
Linklist p,q;
int e;
p = (*L)->next;
while(p)
{
q = p->next;
e = p->data;
free(p);
p = q;
}
(*L)->next = NULL;
}
void PrintList(Linklist *L)
{
Linklist p;
p = (*L)->next;
cout << "链表的数目是:" << endl;
while(p)
{
cout << p->data << "->";
p = p->next;
}
cout << "NULL";
cout << "\n";
}
int main(void)
{
Linklist L;
InitList(&L);
if(!ListEmpty(L))
{
CreateList(&L, 5);
PrintList(&L);
cout << "链表的长度是:" << Listlength(L) << endl;
}
cout << "\n插入数据23到链表第二个位置:" << endl;
ListInsert(&L, 2, 23);
PrintList(&L);
cout << "\n删除第三个位置的元素并显示:";
ListDelete(&L, 3);
PrintList(&L);
cout << "要查找第4个元素并显示:" << LocateElem(L, 4) << endl;
cout << "\n清除整个链表:";
ClearList(&L);
cout << "\n这个链表删除后是:";
PrintList(&L);
return 0;
}