第二章 线性表—循环单链表
数据结构基础代码 (严蔚敏 人邮教育出版社)
带头结点的循环单链表的创建与某一节点的删除
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define OK 1
#define FALSE 0
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//链表的初始化
int InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
L->next=L;//循环单链表的关键就是这里,尾指针指向头结点
return OK;
}
//尾插法创建单循环链表
LNode *CreateList(LinkList &L,int a[],int n)
{
LNode *p,*r;
int i;
r=L;
for(i=0;i<n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
p->data=a[i];
r->next=p;
r=p;
}
r->next=L;
return L;
}
//循环链表某一节点的删除
void Delete(LinkList &L,int N)
{
LNode *p,*q;
q=L;
p=L->next;
while(p!=L)
{
if(p->data==N)
{
q->next=p->next;
p=p->next;
}
p=p->next;
q=q->next;
}
}
//循环链表的打印
void print(LinkList L)
{
LNode *p;
p=L;
while(p->next!=L)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
}
int main()
{
int n,N;
printf("请输入您所创建链表的节点数:\n");
scanf("%d",&n);
int a[n];
LinkList L;
printf("请输入您所创建的链表内容:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
InitList(L);
CreateList(L,a,n);
printf("您所建立的链表如下: ");
print(L);
printf("请输入准备删除的节点: ");
scanf("%d",&N);
Delete(L,N);
print(L);
}