单链表的实现。。。。。。。

/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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值