DS-C项目推出第一个实践子项目

常高伟 提出的DS计划第一个实践子项目,下面是我写的一些代码

 

功能要求:

实现一个list,具有fifo(先进先出)和lifo(后进先出)的功能:

1、提供list的创建和销毁功能。

2、可以获得list成员个数。

3、可以添加一个成员到list头部。

4、可以添加一个成员到list尾部。

5、可以取出(并删除)list头部成员。

6、可以取出(并删除)list尾部成员。

7、可以获取(不删除)list头部成员。

8、可以获取(不删除)list尾部成员。

9、可以将当前成员指针指向第一个成员。

10、可以将当前成员指针指向当前成员的下一个成员。

11、可以获取当前成员。

12、可以删除当前成员。

13、获取相对于头部成员偏移为index的成员。

14、删除相对于头部成员偏移为index的成员。

15、可以添加一个成员到相对于头部成员偏移为index的位置。(添加一个成员,使其相对于头部成员偏移为index)

16、可以添加一个成员到当前成员指针指向的成员之后

 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <assert.h>

typedef struct LIST
{
 int data;
 struct LIST *next;
}list;

//创建list
list *creatList(void)
{
 list *head;
 head = (list *)malloc(sizeof(list));
 assert(head != NULL);
 head->next = NULL;
 head->data = 0;
 return head;
}

//销毁list
void destroyList(list **head)
{
    assert((*head) != NULL);
 list *p;
 
 while((*head) != NULL)
 {
  p = *head;
  *head = (*head)->next;
  free(p);
  p = NULL;
 }
}

//获得list成员的个数
int getListLength(list const *head)
{
 assert(head != NULL);
 int listLength = 0;
 
 while(head->next!= NULL)
 {
     head=head->next;
  listLength++;
 }
 
 return listLength;
}

//添加一个成员到list头部
void insertListHead(list *head, int member)
{
    assert(head != NULL);
 list *p;
 
 p = (list *)malloc(sizeof(list));
 assert(p != NULL);
 p->data = member;
 p->next = head->next;
 head->next = p;
}

//添加一个成员到list尾部
void insertListTail(list *head, int member)
{
 assert(head != NULL);
 list *p;
 
 p=(list *)malloc(sizeof(list));
 assert(p != NULL);
 p->data = member;
 p->next = NULL;
 
 while(head->next != NULL)
 {
  head = head->next;
 }
 
 head->next=p;
}

//取出(并删除)list头部成员
int delListHead(list *head)
{
 assert(head != NULL);
 list *p;
 int value;
 
 p = head->next;
 head->next = p->next;
 value = p->data;
 free(p);
 p = NULL;
 
 return value;
}

//取出(并删除)list尾部成员
int delListTail(list *head)
{
 assert(head != NULL);
 list *p;
 int value;
 
 while(head->next!= NULL)
 {
  p=head;
  head = head->next;
 }
 
 value = head->data;
 free(head);
 head = NULL;
 p->next=head;
 
 return value;
}

//获取(不删除)list头部成员
int getListHead(list *head)
{
 assert(head != NULL);
 int value;
 
 value = head->next->data;
 
 return value;
}

//获取(不删除)list尾部成员
int getListTail(list *head)
{
 assert(head != NULL);
 int value;
 
 while(head->next != NULL)
 {
  head = head->next;
 }
 
 value = head->data;
 
 return value;
}

//将当前成员指针指向第一个成员
void currentPointToHead(list *head, list *current)
{
 assert(head != NULL);
 assert(current != NULL);
 
 list *p = head;
 
 while(head->next != current)
 {
  head = head->next;
 }
 
 head->next = current->next;
 current->next = p->next;
 p->next = current;
}

//将当前成员指针指向当前成员的下一个成员
void currentPointToNext(list *current)
{
 assert(current != NULL);
 list *p;
 
 p=current->next;
 current->next = p->next;
 free(p);
 p=NULL;
}

//获取当前成员
int getCurrentData(list *current)
{
 assert(current != NULL);
 
 return current->data;
}

//删除当前成员
void delCurrent(list *head, list *current)
{
 assert(head != NULL);
 assert(current != NULL);
 
 while(head->next != current)
 {
  head = head->next;
 }
 
 head->next = current->next;
 free(current);
 current = NULL;
}

//获取相对于头部成员偏移为index的成员
int getListMemberData(list *head, int index)
{
 assert(head != NULL);
 assert(index > 0);
 
 while(index-- >0)
 {
  head = head->next;
 }
 
 return head->data;
}

//删除相对于头部成员偏移为index的成员
void delListMemberData(list *head, int index)
{
 assert(head != NULL);
 assert(index>0);
 list *p;
 
 while(index-- >0)
 {
  p = head;
  head = head->next;
 }
 
 p->next = head->next;
 free(head);
 head=NULL;
}

//添加一个成员到相对于头部成员偏移为index的位置
void addListMember(list *head, int index, int value)
{
 assert(head != NULL);
 assert(index > 0);
 list *member;
 
 while(index-- >0)
 {
  head = head->next;
 }
 
 member=(list *)malloc(sizeof(list));
 assert(member != NULL);
 member->data=value;
 member->next=head->next;
 head->next=member;
}

//添加一个成员到当前成员指针指向的成员之后
void addListCurrentMember(list *current, int value)
{
 assert(current != NULL);
 list *p;
 p = (list *)malloc(sizeof(list));
 assert(p != NULL);
 p->data = value;
 p->next = current->next;
 current->next = p;
}


//打印list
void print(list *head)
{
    assert(head != NULL);
 list *p = head->next;
 
 while(p != NULL)
 {
     printf("%d, ", p->data);
  p = p->next;
 }
}

//后进先出push and pop, push的功能可又insertListHead实现
int listPop(list *head)
{
    assert(head != NULL);
    int popnum;
    list *p;
   
    p = head->next;
    popnum = p->data;
    head->next = p->next;
    free(p);
    p=NULL;
    return popnum;
}

//先进先出front and rear, 入队的功能可又insertListHead实现
int listDelQueen(list *head)
{
    assert(head != NULL);
 list *p;
 int queenNum;
 
 while(head->next != NULL)
 {
  p = head;
     head = head->next;
 }
 
 queenNum = head->data;
 free(head);
 head = NULL;
 p->next = head;
 
 return queenNum;
}
 

//test
int main(void)
{
 list *head;
 list *p;
 int i;
 
 head = creatList();
 
 for(i=0;i<10;i++)
 {
  insertListHead(head, i);
 }
 
 printf("/n--------iniList------/n/n");
 print(head);
 
 printf("/n--------insertHead------/n/n");
 insertListHead(head, 12);
 print(head);
 
 printf("/n--------insertTail------/n/n");
 insertListTail(head, 21);
 print(head);
 
 printf("/n--------delListHead------/n/n");
 delListHead(head);
 print(head);
 
 printf("/n-------delListTail-------/n/n");
 delListTail(head);
 print(head);
 
 printf("/n----------currentPointToHead----------/n/n");
 p = head->next->next->next->next;
 currentPointToHead(head, p);
 print(head);
 
 printf("/n----------currentPointToHead----------/n/n");
 p = head->next->next->next->next;
 currentPointToNext(p);
 print(head);
 
 printf("/n----------getListMemberData----------/n/n");
 printf("%d", getListMemberData(head, 6));

 printf("/n---------delListMemberData-----------/n/n");
 delListMemberData(head,7);
 print(head);
 
 printf("/n----------addListMember----------/n/n");
 addListMember(head, 7, 2010);
 print(head);
 
 printf("/n----------addListCurrentMember----------/n/n");
 p = head->next->next->next->next;
 addListCurrentMember(p, 82);
 print(head);
 
 printf("/n----------getListLength----------/n/n");
 printf("%d", getListLength(head));
  
 printf("/n---------listPop-----------/n/n");
 printf("%d/n",listPop(head));
 printf("%d/n",listPop(head));
 printf("%d/n",listPop(head));
 
 print(head);
 
 printf("/n---------listDelQueen-----------/n/n");
 printf("%d/n",listDelQueen(head));
 printf("%d/n",listDelQueen(head));
 printf("%d/n",listDelQueen(head));
 
 print(head);
 
 printf("/n---------destroyList-----------/n/n"); 
 destroyList(&head);
 print(head);
 
 printf("/n---------end-----------/n/n");
 return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值