链表
struct List
{
int data;
struct List* next;
}
创建链表
单链表
实现
struct List* listCreate()
{
int data;
struct List* head = NULL;
struct List* pre = NULL;
struct List* current = NULL;
while(scanf("%d",&data) && data != -1)
{
current = (struct List*)malloc(sizeof(struct List));
if(head == NULL)
head = current;
else
pre->next = current;
current->next = NULL;
current->data = data;
pre = current;
}
return head;
}
错例
struct List* listCreate()
{
int data;;
struct List* current = NULL;
struct List* head = current;
while (scanf("%d", &data) && data != -1)
{
current = (struct List*)malloc(sizeof(struct List));
if (head == NULL)
head = current;
current->data = data;
current = current->next;
}
return head;
}
在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配文章来源地址https://www.toymoban.com/news/detail-787359.html
循环链表
单独创建
struct List* circle_listCreate()
{
int data;
struct List* head = NULL;
struct List* pre = NULL;
struct List* current = NULL;
while(scanf("%d",&data) && data != -1)
{
current = (struct List*)malloc(sizeof(struct List));
if(head == NULL)
head = current;
else
pre->next = current;
current->next = head;
current->data = data;
pre = current;
}
return head;
}
逐节点创建
void Append(struct List** L,int data)
{
struct List* head = *L;
struct List* newNode = NULL;
if((*L) == NULL)
{
(*L) = (struct List*)malloc(sizeof(struct List));
(*L)->data = data;
head = (*L);
(*L)->next = head;
}
else
{
while ((*L)->next != head){
(*L) = (*L)->next;
}
newNode = (struct List*)malloc(sizeof(struct List));
newNode->data = data;
(*L)->next = newNode;
newNode->next = head;
*L = head;
}
}
约瑟夫环问题
void Append(struct List** L,int data)
{
struct List* head = *L;
struct List* newNode = NULL;
if((*L) == NULL)
{
(*L) = (struct List*)malloc(sizeof(struct List));
(*L)->data = data;
head = (*L);
(*L)->next = head;
}
else
{
while ((*L)->next != head){
(*L) = (*L)->next;
}
newNode = (struct List*)malloc(sizeof(struct List));
newNode->data = data;
(*L)->next = newNode;
newNode->next = head;
*L = head;
}
}
void Display(struct List* L,int num)
{
struct List* head = L;
struct List* pre = NULL;
struct List* kill = NULL;
int nodeNum = 0;
while (L->next != head)
{
nodeNum++;
L = L->next;
}
pre = L;
L = L->next;
nodeNum++;
while (nodeNUm)
{
if (nodeNum == 1)
{
printf("%d",L->data);
free(L);
return;
}
for (int i=1; i < m; i++)
{
pre = L;
L = L->next;
}
printf("%d ", L->data);
kill = L;
L = L->next;
free(kill);
nodeNum--;
}
}
删除节点
实现方式一:
struct list* listDelete(struct list* L,int data)
{
struct list* pre = L;
struct list* head = L;
struct list* kill;
while(head != NULL && head->data == m)
{
kill = head;
head = head->next;
free(kill);
}
if(head == NULL)
return head;
pre = head;
kill = head->next;
while(kill!=NULL)
{
if(kill->data == m)
{
pre->next = kill->next;
free(kill);
kill = pre->next;
}
else
{
pre = kill;
kill = kill->next;
}
}
return head;
}
实现方式二:
struct list* listDelete(struct list** L,int data)
{
struct list* head = (*L), * pre = (*L);
struct list* newL = *L;
struct list* kill = NULL;
while (*L !- NULL)
{
if((*L)->data == data)
{
if((*L) == newL)
newL == newL->next;
else
pre->next = (*L)->next;
kill = (*L);
(*L) = (*L)->next;
free(kill);
}
else
{
pre = (*L);
(*L) = (*L)->next;
}
}
*L = newL;
return head;
}
删除节点并建立新链表
struct list* list_Delete_Create(struct list** L) //数据为奇数存为新链表
{
struct list* newhead = NULL, * newcurrent = NULL, * newpre = NULL;
struct list* newL = *L;
struct list* kill = NULL;
struct list* pre = *L;
while (*L)
{
if((*L)->data%2 == 1)
{
newcurrent = (struct list*)malloc(sizeof(struct list));
if(newhead == NULL)
newhead = newcurrent;
else
newpre->next = newcurrent;
newcurrent->data = (*L)->data;
newcurrent->next = NULL;
newpre = newcurrent;
if((*L) == newL)
newL = newL->next;
else
pre-next = (*L)->next;
kill = (*L);
(*L)=(*L)->next;
free(kill);
}
else
{
pre = (*L);
(*L) = (*L)->next;
}
}
*L = newL;
return newhead;
}
逆置链表
实现
文章来源:https://www.toymoban.com/news/detail-787359.html
到了这里,关于约瑟夫环问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!