#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct lnode
{
ElemType data;
struct lnode *next;
}LNode,*LinkList;
int CreateLinkList(LinkList &L,int num) //创建循环单链表
{
int i;
LinkList s,p;
p = L = (LNode *)malloc(sizeof(LNode));
L->next = L; //空的循环单链表
for(i = 1;i <= num;i++) //顺位序创建
{
s = (LinkList)malloc(sizeof(LNode));
s->data = i;
s->next = p;
p->next = s;
p = s;
}
return num;
}
void LinkListInsert(LinkList &L,ElemType e,int pos) //插入元素
{
LinkList p,s;
int j;
p = L;
j = 0;
while(p && j < pos -1)
{
p = p->next;
j++;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
void LinkListDelete(LinkList &L,ElemType &e,int pos) //删除
{
LinkList p,q;
int j = 0;
p = L;
while(p->next && j < pos - 1)
{
p = p->next;
j++;
}
if(!p->next || j > pos - 1)
{
printf("\n指定位置不合理,操作失败,程序退出!");
exit(!0);
}
q = p->next;
e = q->data;
p->next = q->next;
free(q);
}
void GetElemType(LinkList L,int pos) //读取元素
{
LinkList p = L->next;
int j = 1;
while(p->next && j < pos)
{
p = p->next;
j++;
}
if(!p->next || j > pos)
{
printf("\n读取位置不合理,操作失败,程序退出!");
exit(!0);
}
printf("读取单循环链表第 %d 个结点的,值为:%d。",pos,p->data);
}
void Traverse(LinkList L,int num) //遍历
{
LinkList p = L->next;
for(int i=1; i <= num; i++)
{
if(p->next)
printf("%2d ->",p->data);
else
printf("%4d",p->data);
p = p->next;
}
}
int main()
{
LinkList L;
ElemType e;
int pos,num;
printf("请输入循环单链表的长度:");
scanf("%d",&num);
CreateLinkList(L,num);
printf("循环链表为:");
Traverse(L,num++);
printf("\n\n请输入需要插入的元素:");
scanf("%d",&e);
printf("请输入需要插入的位置:");
scanf("%d",&pos);
LinkListInsert(L,e,pos);
printf("单循环链表第%d个位置插入,值为 %d 的结点。\n",pos,e);
printf("循环链表为:");
Traverse(L,num);
printf("\n\n请输入需要删除的元素位置:");
scanf("%d",&pos);
LinkListDelete(L,e,pos);
printf("单循环链表删除第%d个位置,值为 %d 的结点。",pos,e);
printf("\n循环链表为:");
Traverse(L,--num);
printf("\n\n请输入需要读取元素的位置:");
scanf("%d",&pos);
GetElemType(L,pos);
printf("\n\n\n\n");
system("pause");
}
C语言—循环单链表
猜你喜欢
转载自blog.csdn.net/Long_UP/article/details/121766962
今日推荐
周排行