先贴上代码先:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
/**
* @brief Create a List object 尾插法创建单向循环链表,并返回一个指向链表表头的指针
* @return LNode* 链表表头指针
*/
LNode *createList(){
LNode *head,*q,*p;
int elem = 0,len = 0; // 元素 长度
// 申请新的内存空间,建立表头结点
head = (LNode *)malloc(sizeof(LNode));
q = head;
printf("Input length of the list: ");
scanf("%d",&len); // 单链表结点个数
head->data = len; // 表头结点赋值为len,即表中结点个数
// n<=0,建立仅含表头结点的空表
if(len > 0){
printf("Input the NodeData: ");
while(len > 0){
// 输入新元素,如果输入的是数字,则加入链表
if(scanf("%d",&elem) == 1){
p = (LNode *)malloc(sizeof(LNode));
p->data = elem;
q->next = p;
q = p;
len--;
}else{
getchar(); // 清除输入缓冲区中的非数字
}
}
q->next = head;
return(head);
}
}
/**
* @brief 返回结点p的直接前驱结点q
*/
LNode *prior(LNode *p){
LNode *q;
q = p->next;
while(q->next != p)
q = q->next;
return(q);
}
/**
* @brief 释放链表的元素内存
*/
void freeNode(LNode *head){
LNode *q = head,*p;
do{
p = q->next;
free(q);
q = p;
}while(p != head);
printf("freeNode successful!\n");
}
void display(LNode *head){
LNode *p = head->next;
while(p->next->next != p){
printf("%d ",p->data);
p = p->next;
if(p == head)
break;
}
printf("\n");
}
int main(){
LNode *L,*c,*p;
int i,j;
// 建立单向循环链表
L = createList();
// 给出单向循环链表中的结点序号,表头结点序号为0
printf("Input NodeNumber: ");
scanf("%d",&j); // 0---表中的结点个数
p = L;
for(i = 0;i < j;i++)
p = p->next; // 按序号确定一个p结点
c = prior(p);
printf("Node %d's prior is: %d\n",p->data,c->data);
freeNode(L);
}
编译运行如下:
求问各位兄弟,这里获取前驱结点为什么会出错?
比如我获取第一个结点的前驱,不应该是获得数据9的嘛,为什么还是5,而获取第二个结点6的前驱是5,是正确的,不知道什么问题,特来请教。