循环链表以及双向链表的简单操作
循环链表即最后一个结点的next指针指向头结点,判断遍历是否结束的条件也变成了是否回到了头结点或者下一个就是头结点.
使用循环链表可以找到前驱,但没有双向链表方便
include <stdio.h>
include<stdlib.h>
typedef long ElemType;
#define ERROR 0
#define OK 1
typedef struct Node
{
ElemType Data;
struct Node* PNext;
}Node;
typedef Node* PNode;
int CountNum;
int CreateList(PNode* PList,PNode HNode)
{
PNode NewNode = (PNode)malloc(sizeof(Node));
if (!NewNode) return ERROR;
NewNode->Data = CountNum++;
(*PList)->PNext = NewNode;
NewNode->PNext = HNode;
(*PList) = NewNode;
return OK;
}
int InsertLine(PNode TrvP, int n, ElemType NewData,PNode HNode)//在第n位置插入一个结点
{
int i = 0;
while ((TrvP!=HNode||!i) && i < n - 1)
{
TrvP = TrvP->PNext;
i++;
}
if ((i&&TrvP==HNode) || i > n - 1) return ERROR;
Node* InsertNode = (Node*)malloc(sizeof(Node));
InsertNode->Data = NewData;
InsertNode->PNext = TrvP->PNext;
TrvP->PNext = InsertNode;
return OK;
}
int main()
{
PNode HNode = (PNode)malloc(sizeof(Node));
HNode->PNext = HNode;
PNode List=HNode;
PNode TrvP = HNode;
for(int i=0;i<10;i++) CreateList(&List,HNode);
InsertLine(TrvP, 11, 23, HNode);
for (PNode p = HNode->PNext; p != HNode; p = p->PNext) printf("%d\n", p->Data);
}
双向链表结点与结点的联系更强,操作更加容易,但每次修改都要改变两个指针
include <stdio.h>
include <stdlib.h>
#define OK 1
#define ERROR 0
typedef long ElemType;
typedef struct Node
{
ElemType Data;
Node* Prior;
Node* Next;
}Node;
typedef Node* PNode;
int CountNum;
int CreateNode(PNode* PList,PNode HNode)
{
PNode NewNode = (PNode)malloc(sizeof(Node));
if (!NewNode) return ERROR;
NewNode->Data = CountNum++;
NewNode->Prior = *PList;
(*PList)->Next = NewNode;
NewNode->Next = HNode;
*PList = NewNode;
return OK;
}
int DeleteNode(PNode TrvP, int n,PNode HNode)
{
int i = 1;
TrvP = TrvP->Next;
while ((TrvP != HNode) && i < n )
{
TrvP = TrvP->Next;
i++;
}
if (i > n || (TrvP == HNode)) return ERROR;
TrvP->Prior->Next = TrvP->Next;
TrvP->Next->Prior = TrvP->Prior;
free(TrvP);
return OK;
}
int main()
{
PNode HNode = (PNode)malloc(sizeof(Node));
HNode->Next = HNode;
HNode->Prior = HNode;
PNode PList = HNode;
PNode TrvP = HNode;
for (int i = 0; i < 10;i++) CreateNode(&PList, HNode);
DeleteNode(TrvP, 10, HNode);
for (PNode P = HNode->Next; P != HNode; P = P->Next) printf("%d\n", P->Data);
}

浙公网安备 33010602011771号