1. 概述
链表由一系列的节点组成,这些节点不必在内存中连续存储;节点包含两部分:值(key)和指向后继节点的链(link),常称之为next指针。链表形式如下所示:
最后一个节点的的next指针指向null。
2. 基本操作
插入操作:需要修改前后元素的next指针的指向
删除操作:修改一个next引用即可实现。
3. 问题
3.1 POJ 3750
本题是一个简化的Joseph问题。
思路:创建一个双向循环链表(之所以用双向循环链表,是为了方便删除操作),模拟题目中的操作。
好长时间没写链表,连创建操作写了好久才写对。
源代码:
| 3750 | Accepted | 164K | 0MS | C | 1075B | 2013-10-05 19:04:24 |
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct list
{
char name[15];
struct list *pre,*next;
}List;
/*create a linked list, and return the head node*/
List *create(int n)
{
int i;
char ch[15];
List *pnew,*head,*tail;
head=(List *) malloc(sizeof(List));
scanf("%s",&ch);
strcpy(head->name,ch);
head->pre=head; head->next=head;
tail=head;
for(i=2;i<=n;i++)
{
pnew=(List *) malloc(sizeof(List));
scanf("%s",&ch);
strcpy(pnew->name,ch);
pnew->pre=tail; pnew->next=head;
head->pre=pnew; tail->next=pnew;
tail=pnew;
}
return head;
}
/*move from the *first */
List *move(List *first,int step)
{
List *p=first;
int i;
for(i=1;i<=step;i++)
p=p->next;
return p;
}
/*delete a node*/
void delete(List *p)
{
p->pre->next=p->next;
p->next->pre=p->pre;
free(p);
}
int main()
{
List *head,*p,*temp;
int n,w,s;
scanf("%d",&n);
head=create(n);
scanf("%d,%d",&w,&s);
p=move(head,w-1);
while(p->next!=p)
{
p=move(p,s-1);
printf("%s\n",p->name);
temp=p;
p=p->next;
delete(temp);
}
printf("%s\n",p->name);
return 0;
}
本文详细介绍了链表的基本概念,包括节点结构、插入和删除操作,并通过POJ3750题目的实例展示了如何使用双向循环链表解决简化版的约瑟夫问题。文章深入探讨了链表在数据结构中的应用,以及在编程实践中的具体操作。
1143

被折叠的 条评论
为什么被折叠?



