1、单向循环链表的实现以及基本功能
/**
* 由于单向循环链表和单向链表基本一样,因此大部分代码我直接复制粘贴单向链表的代码
* 我们只需要把 p->next = NULL或者p = NULL 这两个条件改为 p->next = LL或者p = L 就可以啦
*
*/
#include<stdio.h>
#include <mm_malloc.h>
#define MAXSIZE 15 // 常量的定义不需要分号也不需要等号 MAXSIZE = 5; 这样是错误的
#define OK 1
#define ERROR -1
#define NOTFOUND -2
typedef struct Node{
char data;
struct Node *next;
}Node,*LinkList;
/*int main(){
LinkList creatLinkList();
void createFromHead(LinkList L);
void dispaly(LinkList L);
void createFormTail(LinkList L);
int getLinkListLength(LinkList L);
int insert(LinkList L ,char elem,int index);
int delete(LinkList L ,int index);
int getElem(LinkList L,int index);
int getIndex(LinkList L,char elem);
LinkList createFormTailReturnTail(LinkList L);
LinkList L = creatLinkList();
LinkList RA = createFormTailReturnTail(L);
dispaly(RA->next);
}*/
//初始化单向链表
LinkList creatLinkList(){
Node *p = (Node *)malloc(sizeof(Node));
p->next = NULL;
return p;
};
//尾插法建立单向表
void createFormTail(LinkList L){
Node *p,*r;
r = L;
char c;
int flag = 1;
while(flag){
c = getchar();
if (c != '$'){
p = (Node *)malloc(sizeof(Node));
p->data = c;
r->next = p;
r = p;
}else{
r->next = L;
flag = 0;
}
}
}
//尾插法建立单向表,并返回尾指针
LinkList createFormTailReturnTail(LinkList L){
Node *p,*r;
r = L;
char c;
int flag = 1;
while(flag){
c = getchar();
if (c != '$'){
p = (Node *)malloc(sizeof(Node));
p->data = c;
r->next = p;
r = p;
}else{
r->next = L;
flag = 0;
}
}
return r;
}
//遍历单向链表
void dispaly(LinkList L){
Node *p = L;
while (p->next != L){
p = p->next;
printf("%c\t",p->data);
}
}
//得到单向链表的长度
int getLinkListLength(LinkList L) {
Node *p = L;
int length = 0;
while (p->next != NULL) {
p = p->next;
length++;
}
return length;
}
//插入数据 返回1表示成功,-1表示失败
int insert(LinkList L ,char elem,int index){
//插入为位置小于1肯定是不对的,毫无疑问的
if (index < 1){
printf("输入的位置不对!");
return ERROR;
}
Node *pre,*r;
pre = L;
int j = 0;
while(pre != L && j < index-1){//这是成立的条件,当遍历完还没找到插入的位置或者是找到插入的位置都跳出循环
pre = pre ->next;
j++;
}
if (pre == L){ //由于while循环结束肯能是因为pre ==NULL造成的所以要判断一下
printf("插入的位置过大!");
return ERROR;
}
//到达这一步肯定是意味着来到了
r = (Node *)malloc(sizeof(Node));
r->data = elem;
r->next = pre->next;
pre->next = r;
return OK;
}