1. 单向循环链表创建

这里分两种情况判断是否是第一次创建:
- YES->创建一个新结点,并使得新结点的next指向自身(L)->next = (L)
- NO-> 找链表尾结点,将尾结点的next=新结点 新结点的next = (*L)
准备条件:
#define ERROR 0#define TRUE 1#define FALSE 0#define OK 1#define MAXSIZE 20 /* 存储空间初始分配量 */typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int *///定义结点typedef struct Node{ElemType data;struct Node *next;}Node;typedef struct Node * LinkList;
实现方式两种:
1.1 for循环遍历
Status CreateList(LinkList *L){int item;LinkList temp = NULL;LinkList target = NULL;printf("输入节点的值,输入0结束\n");while(1){scanf("%d",&item);if(item==0) break;//如果输入的链表是空。则创建一个新的节点,使其next指针指向自己 (*head)->next=*head;if(*L==NULL){*L = (LinkList)malloc(sizeof(Node));if(!L)exit(0);(*L)->data=item;(*L)->next=*L;}else{//输入的链表不是空的,寻找链表的尾节点,使尾节点的next=新节点。新节点的next指向头节点for (target = *L; target->next != *L; target = target->next);temp=(LinkList)malloc(sizeof(Node));if(!temp) return ERROR;temp->data=item;temp->next=*L; //新节点指向头节点target->next=temp;//尾节点指向新节点}}return OK;}
1.2 临时变量记录最后一个
Status CreateList2(LinkList *L){int item;LinkList temp = NULL;LinkList target = NULL;LinkList r = NULL;printf("请输入新的结点, 当输入0时结束!\n");while (1) {scanf("%d",&item);if (item == 0) {break;}//第一次创建if(*L == NULL){*L = (LinkList)malloc(sizeof(Node));if(!*L) return ERROR;(*L)->data = item;(*L)->next = *L;r = *L;}else{temp = (LinkList)malloc(sizeof(Node));if(!temp) return ERROR;temp->data = item;temp->next = *L;r->next = temp;r = temp;}}return OK;}
2. 单向链循环表插入
2.1 插入在首元结点
2.2 插入在它位置
2.3 代码实现
Status ListInsert(LinkList *L, int place, int num){LinkList temp ,target;int i;// place == 1 表示插入在首元结点if (place == 1) {//如果插入的位置为1,则属于插入首元结点,所以需要特殊处理//1. 创建新结点temp,并判断是否创建成功,成功则赋值,否则返回ERROR;//2. 找到链表最后的结点_尾结点,//3. 让新结点的next 执行头结点.//4. 尾结点的next 指向新的头结点;//5. 让头指针指向temp(临时的新结点)temp = (LinkList)malloc(sizeof(Node));if (temp == NULL) {return ERROR;}temp->data = num;for (target = *L; target->next != *L; target = target->next);temp->next = *L;target->next = temp;*L = temp;} else{//如果插入的位置在其他位置;//1. 创建新结点temp,并判断是否创建成功,成功则赋值,否则返回ERROR;//2. 先找到插入的位置,如果超过链表长度,则自动插入队尾;//3. 通过target找到要插入位置的前一个结点, 让target->next = temp;//4. 插入结点的前驱指向新结点,新结点的next 指向target原来的next位置 ;temp = (LinkList)malloc(sizeof(Node));if (temp == NULL) {return ERROR;}temp->data = num;for ( i = 1,target = *L; target->next != *L && i != place - 1; target = target->next,i++) ;temp->next = target->next;target->next = temp;}return OK;}
3. 单向循环链表删除实现
链表的删除同样也是分两种情况:
- 删除首元结点
删除其他结点
Status LinkListDelete(LinkList *L,int place){LinkList temp,target;int i;//temp 指向链表首元结点temp = *L;if(temp == NULL) return ERROR;if (place == 1) {//①.如果删除到只剩下首元结点了,则直接将*L置空;if((*L)->next == (*L)){(*L) = NULL;return OK;}//②.链表还有很多数据,但是删除的是首结点;//1. 找到尾结点, 使得尾结点next 指向头结点的下一个结点 target->next = (*L)->next;//2. 新结点做为头结点,则释放原来的头结点for (target = *L; target->next != *L; target = target->next);temp = *L;*L = (*L)->next;target->next = *L;free(temp);}else{//如果删除其他结点--其他结点//1. 找到删除结点前一个结点target//2. 使得target->next 指向下一个结点//3. 释放需要删除的结点tempfor(i=1,target = *L;target->next != *L && i != place -1;target = target->next,i++) ;temp = target->next;target->next = temp->next;free(temp);}return OK;}
4. 单向循环链表查询值
int findValue(LinkList L,int value){int i = 1;LinkList p;p = L;//寻找链表中的结点 data == valuewhile (p->data != value && p->next != L) {i++;p = p->next;}//当尾结点指向头结点就会直接跳出循环,所以要额外增加一次判断尾结点的data == value;if (p->next == L && p->data != value) {return -1;}return i;}
**
