#ifndef List_H
#define List_H
#endif
typedef int Item;
typedef struct node * PNode;
typedef struct node
{
Item item;
PNode next;
} Node;
typedef PNode Position;
typedef PNode List;
/*
功能
n生空链表L
*/
List MakeEmpty(List L);
/*
功能
判定链表是否为空
*/
int IsEmpty(List L);
/*
功能
判定位置P的节点是否为尾节点
*/
int IsLast(Position P);
/*
功能
在链表L中查找数据项为X的第一个节点
*/
Position Find(Item X, List L);
/*
功能
在链表L中删除数据项为X的第一个节点
*/
void Delte(Item X, List L);
/*
功能
在链表L中查找数据项为X的第一个节点的前驱位置
*/
Position FindPrevious(Item X, List L);
/*
功能
在链表L中查找数据项为X的第一个节点的后继位置
*/
Position FindNext(Item X, List L);
/*
功能
在链表L中P位置插入数据项为X的节点
*/
void Insert(Item X, List L, Position P);
/*
功能
删除链表L初头节点外的所有节点
*/
void DelteList(List L);
/*
功能
获得链表L中头节点位置
*/
Position Header(List L);
/*
功能
获得链表L中第一个数据节点位置
*/
Position First(List L);
/*
功能
获得位置P的后继节点位置
*/
Position Advance(Position P);
/*
功能
获得P位置节点的数据项
*/
Item Retrieve(Position P);
list.c
#include "list.h"
#include <malloc.h>
#include <stdlib.h>
List MakeEmpty(List L)
{
L = (PNode)malloc(sizeof(Node));
L->item = 0;
L->next = NULL;
return L;
}
int IsEmpty(List L)
{
return L->next == NULL;
}
int IsLast(Position P)
{
return P->next == NULL;
}
Position Find(Item X, List L)
{
Position P;
P = L->next;
while(P!=NULL && P->item!=X)
{
P = P->next;
}
return P;
}
void Delete(Item X, List L)
{
Position P, temp;
P = FindPrevious(X,L);
if(!IsLast(P))
{
temp = P->next;
P->next = temp->next;
free(temp);
}
}
Position FindPrevious(Item X, List L)
{
Position P;
P = L;
while(P->next!=NULL && P->next->item != X)
{
P= P->next;
}
return P;
}
Position FindNext(Item X, List L)
{
Position P;
P = L;
while(P!=NULL && P->item != X)
{
P = P->next;
}
return P->next;
}
void Insert(Item X, List L, Position P)
{
Position tmp;
tmp = malloc(sizeof(Node));
if(tmp == NULL)
exit(0);
tmp->item = X;
tmp->next = P->next;
P->next = tmp;
}
void DeleteList(List L)
{
Position P, tmp;
P=L->next;
L->next = NULL;
while(P!=NULL)
{
tmp = P->next;
free(P);
P = tmp;
}
}
Position Header(List L)
{
return L;
}
Position Fist(List L)
{
if(L->next != NULL)
return L->next;
}
Position Advance(Position P)
{
if(P!=NULL)
return P->next;
}
Item Retrieve(Position P)
{
if(P!=NULL)
return P->item;
}
testlist.c
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
int main()
{
List list=NULL;
Position P, currentP;
int i, num;
num = 10;
list = MakeEmpty(list);
if(IsEmpty(list)){
printf("list is NULL \n");
}
P = list;
for(i=0;i<num;i++)
{
Insert(i*i,list,P);
P = Advance(P);
printf("already insert %d \n",Retrieve(P));
}
currentP = Find(25, list);
printf("currentP is %d \n", currentP->item);
P = FindNext(currentP->item,list);
printf("next of number 25 is: %d \n",Retrieve(P));
P = FindPrevious(currentP->item,list);
printf("preview of number 25 is: %d \n",Retrieve(P));
Delete(currentP->item,list);
P=list;
for(i=0;i<num;i++)
{
P = Advance(P);
printf("after delete %d \n",Retrieve(P));
}
DeleteList(list);
printf("already deleted list\n");
if(IsEmpty(list))
printf("list is NULL\n");
}
测试环境Fedora 20, gcc (GCC) 4.8.3 20140624
编译命令:gcc list.c testlist.c -o output.out
以下是同一个例子,但在前一个基础上添加了一些头元素与尾元素的校验,目前只实现了新建,初使化,校验长度,在链表头与尾添加元素,删除某个元素,及清除整个链表功能;
功能都已经在实际电脑上测试通过;
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef int Item;
typedef struct SingleNode * PNode;
typedef struct SingleNode{
Item item;
PNode next;
} Node;
//创建一个链表中位置指针
typedef PNode Position;
//创建一个链表集合,实际也是一个指针,指向链表第一个元素的指针
typedef PNode List;
/*
创建一个链表,并初使化为一个包含0值的元素
*/
List createEmpty(List L)
{
L = (PNode)malloc(sizeof(Node));
L->item = 0;//创建了一个值为0的表头
L->next = NULL;
return L;
}
/*
x打印元素清单
*/
void
printList(List L)
{
int i=0;
Position P;
P = L;
while(P!=NULL)
{
printf("number %d of this list is: %d\n",i,P->item);
P = P->next;
i++;
}
}
/*
插入链表新的元素
*/
void
insertElement(Item X, List L, Position P)
{
Position tmp;
tmp = malloc(sizeof(Node));
if(tmp == NULL)
exit(0);
tmp->next = P->next;
tmp->item = X;
P->next = tmp;
}
/*
返回链表第一个元素
*/
Position
getFirst( List L)
{
if(L->next!=NULL)
return L->next;
}
/*
返回链表的最后一个元素
*/
Position
getLast(List L)
{
Position P;
P = L;
while(P->next!=NULL)
P = P->next;
return P;
}
/*
在链表头部插入元素
*/
void
insertElementAtStart(Item X, List L)
{
insertElement(X,L,L);
}
/*
在链表尾部插入元素
*/
void insertElementAtEnd(Item X, List L)
{
Position end, P;
P = L;
end = getLast(P);
insertElement(X,L,end);
}
Position
getPosition(Item X,const List L)
{
Position P;
P = L;
while(P!=NULL && P->item != X)
{
P=P->next;
}
return P;
}
/*
获得当前元素的前一个元素
*/
Position
getPreviewElement(Item X, const List L)
{
Position P, tmpX;
P = L;
if(isFirst(X,P))
return NULL;
while(P->next!=NULL && P->next->item != X)
{
P = P->next;
}
return P;
}
/*
获取链表当前元素的下一个元素
*/
Position
getNextElement(Item X,const List L)
{
Position P,tmpX;
P = L;
if(isLast(X,P))
return NULL;
while(P != NULL && P->item != X)
{
P = P->next;
}
return P->next;//返回当前元素的下一个元素
}
/*
获取链表长度
*/
int
getLength(const List L)
{
Position P;
P = L;
int j = 0;
while(P != NULL)
{
P = P->next;
j++;
}
return j;
}
/*
判断是否是最后一个节点
*/
int
isLast(Item X,const List L)
{
Position P;
P = L;
while(P!=NULL && P->item != X)
P = P->next;
return P->next == NULL;
}
/*
判断是否是第一个元素
*/
int
isFirst(Item X, const List L)
{
return L!=NULL && (L->item == X);
}
/*
判断当前链表是否为空
*/
int
isEmpty(List L)
{
return L->next == NULL;
}
/*
获取当前元素的下一个节点指针
*/
Position
advance(Position P)
{
if(P != NULL)
return P->next;
}
/*
获取当前元素的元素值
*/
Item
retrieve(Position P)
{
if(P!=NULL)
return P->item;
}
/*
删除指定值的元素
**/
void deleteElement(Item X, List L)
{
Position tmp,P;
if(isFirst(X,L))
{
P = L;
tmp = P;
L->next = tmp->next->next;//因测试前执行了P2=P2->next去掉过表头
free(tmp);
}
else
{
P = getPreviewElement(X, L);
tmp = P->next;
P->next = tmp->next;
free(tmp);
}
}
/*
删除除表头外所有元素
*/
void deleteList(List L)
{
Position P, tmp;
P = L;
while(P!=NULL)
{
printf("p is: %d\n",P->item);
tmp = P->next;
free(P);
P = tmp;
}
L->next = NULL;
}
/*
打印测试
*/
void
printTest(Item X, List list)
{
printList(list);
printf("the length of this list is: %d\n", getLength(list));
Position previewE = getPreviewElement(X, list);
if(previewE == NULL)
printf("item %d is the first item, no preview element exist!\n", X);
else
printf("the previews of item %d is: %d\n", X, previewE->item);
Position nextE = getNextElement(X, list);
if(nextE == NULL)
printf("item %d is the last item, no next element exist!\n",X);
else
printf("the next of item %d is: %d\n", X, nextE->item);
}
int
main()
{
List list = NULL;
Position P,P1,P2,P3;
int i, num;
Item item = 16;
num = 10;
list = createEmpty(list);
if(isEmpty(list))
P = list;
//创建及打印某元素的前置与后继元素及长度
for(i=0;i<num;i++)
{
insertElement(i*i, list, P);
P = advance(P);
}
printf("创建链表完成后打印\n");
P1 = list->next;//跳过表头
printTest(item, P1);
//链表头插入元素及打印元素的前置与后继元素及长度
Item startItem = 100;
P2 = list;
insertElementAtStart(startItem,P2);
printf("头部插入元素newItem:%d 后的打印\n",startItem);
P2 = P2->next;//跳过表头
printTest(startItem,P2);
//链表尾插入元素及打印元素的前置与后继元素及长度
Item endItem = 110;
insertElementAtEnd(endItem,P2);
printf("尾部插入元素newItem:%d 后的打印\n",endItem);
printTest(endItem,P2);
//删除元素及打印元素的前置与后继元素及长度
Item deleteItem = 16;//测试过头元素100, 尾元素100,均删除正常
deleteElement(deleteItem,P2);
printf("删除元素 %d 后的打印\n",deleteItem);
printTest(9,P2);
//删除链表除表头外所有元素,删除后加上表头链表长度为1
deleteList(P2);
printf("删除所有元素后打印");
printList(P2);
printf("删除后链表长度为:%d\n",getLength(P2));
}
本文全面覆盖信息技术领域的各个方面,从基础的前端开发、后端开发到移动应用开发,再到游戏开发、大数据开发、AI音视频处理等细分领域。详细介绍了各领域的关键技术和工具,旨在为读者提供一个全面的技术视野,帮助理解信息技术领域的发展现状和趋势。
1988

被折叠的 条评论
为什么被折叠?



