常高伟 提出的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;
}