#include <stdio.h>
#include <stdlib.h>
#define error printf
struct node;
typedef int ElementType;
typedef struct node* List;
typedef struct node* Node;
struct node
{
ElementType Element;
Node Next;
};
List Initialize()
{
List head = (struct node*)malloc(sizeof(struct node));
if (head == NULL)
error("out of space!\n");
else
{
head->Next = NULL;
}
return head;
}
int IsEmpty(List list)
{
if (list->Next == NULL)
return 1;
else
return 0;
}
Node FoundI(List list,int i) //查找序号为i的元素
{
int k;
Node P=list;
for (k = 1; k <= i; k++)
{
P = P->Next;
}
return P;
}
Node FoundValue(List list, ElementType x) //查找第一个值为x的元素
{
Node P = list->Next;
while ((P->Next != NULL) && (P->Element != x))
P = P->Next;
return P;
}
void InsertFirst(List list, ElementType value) //插入新元素作为第一个元素
{
Node TmpCell;
TmpCell = (Node)malloc(sizeof(struct node));
if (TmpCell == NULL)
error("out of space!\n");
else
{
TmpCell->Element = value;
TmpCell->Next = list->Next;
list->Next = TmpCell;
}
}
void InsertLast(List list, ElementType value)
{
Node TmpCell,PtrLast;
PtrLast = list;
while (PtrLast->Next != NULL)
PtrLast = PtrLast->Next;
TmpCell = (Node)malloc(sizeof(struct node));
if (TmpCell == NULL)
error("out of space!\n");
else
{
TmpCell->Element = value;
PtrLast->Next = TmpCell;
TmpCell->Next = NULL;
}
}
void InsertI(List list, int i, ElementType value) //将元素插入到第i个位置
{
Node TmpCell,PtrPreNode; //PtrPreNode为指向第i个含有元素的节点的前一个节点的指针
int k;
PtrPreNode = list;
for (k = 1; k < i; k++)
PtrPreNode = PtrPreNode->Next;
TmpCell = (Node)malloc(sizeof(struct node));
if (TmpCell == NULL)
error("out of space!\n");
else
{
TmpCell->Element = value;
TmpCell->Next = PtrPreNode->Next;
PtrPreNode->Next = TmpCell;
}
}
void DeleteFirst(List list) //删除第一个元素
{
Node TmpCell;
if (!IsEmpty(list))
{
TmpCell = list->Next;
list->Next = TmpCell->Next;
free(TmpCell);
}
}
void DeleteLast(List list) //删除最后一个元素
{
Node TmpCell,PtrLast,PtrPreLast;
if (!IsEmpty(list))
{
if (list->Next->Next == NULL) //链表只有一个带有元素的节点时
{
TmpCell = list->Next;
free(TmpCell);
list->Next = NULL;
}
else
{
/*PtrPreLast = list;
PtrLast = list->Next;
while ((PtrLast->Next) != NULL)
{
PtrLast = PtrLast->Next;
PtrPreLast = PtrPreLast->Next;
}
PtrPreLast->Next = NULL;
free(PtrLast);*/
PtrPreLast = list;
PtrLast = list->Next;
while (PtrPreLast->Next->Next == NULL)
PtrPreLast = PtrPreLast->Next;
TmpCell = PtrPreLast->Next;
PtrPreLast->Next = NULL;
free(TmpCell);
}
}
}
void DeleteI(List list, int i) //删除第i个元素
{
int k;
Node TmpCell,PtrPreNodeI;
PtrPreNodeI = list;
if (!IsEmpty(list))
{
for (k = 1; k < i; k++)
PtrPreNodeI = PtrPreNodeI->Next;
TmpCell = PtrPreNodeI->Next;
PtrPreNodeI->Next = TmpCell->Next;
free(TmpCell);
}
}
int main()
{
struct node list;
Initialize(&list);
InsertFirst(&list, 3);
InsertFirst(&list, 6);
InsertFirst(&list, 11);
InsertFirst(&list, 23);
DeleteLast(&list);
Node P = FoundI(&list, 3);
printf("%d\n", P->Element);
}
带头结点的单链表
最新推荐文章于 2024-03-06 20:59:10 发布