关于数据结构链表的相关代码

代码基本属于搬运,部分备注加了些自己的理解,主要是方便自己学习<(^-^)>

代码分为链表的基本操作和约瑟夫问题两部分。
原代码见链接:C语言程序设计
这是北理工C语言的入门课,大家有兴趣可以去看看。

链表的基本操作

(包含创建、插入、删除、访问)

#include<stdio.h> //重点看文字,理解链表的思想
#include<stdlib.h>
struct node
{ char name[20],address[20],phone[15];
struct node *link;
};
typedef node NODE;

main()
{
NODE *head;
NODE p;
p=(NODE
)malloc(sizeof(NODE));
p->link=NULL;
head=p;
//创建一个不含数据结点的空链表(包含头指针和表头结点)
int create(NODE *head,int n);
create(head,2);
int insert_code(NODE *head,NODE *p,int i);

p=(NODE *)malloc(sizeof(NODE));
gets(p->name);
insert_node(head,p,1);

int output(NODE *head);
output(head);

int delete_node(NODE*head,int i);
delete_node(head,2);

output(head);

getchar();
}

int create(NODE *head,int n)
//创建一个长度为n的链表(n个数据结点)
{ NODE *p;
for( ; n>0 ; n–)
{ p=(NODE *)malloc(sizeof(NODE));
gets(p->name);
p->link=head->link;
//链接后面
head->link=p;
//链接前面
}
return 0;
}

int output(NODE*head)
//访问全部数据结点
{ NODE *p;
p=head->link;
while(p!=NULL)
{ puts(p->name);
p=p->link;
}
return 0;
}

int insert_node(NODE *head,NODE *p,int i)
//在第i个结点后面插入一个结点
{ NODE *q;
int n=0;
for(q=head; n<i&&q->link!NULL; ++n)
//q=q->link和++n均为"增量表达式"
q=q->link; //定位 指向第i个节点点(数据结点,非表头)
p->link=q->link; //链接后面
q->link=p; //链接前面
retrun 0;
}

int delete_node(NODE* head, int i)
//删除第i个结点
{ NODE* q;
NODE* p;
int n;
for(n=0,q=head; n<i-1&&q->link!=NULL; ++n)
q=q->link;
//定位,指向第i-1个结点
if(i>0&&q->link!=NULL)
{ p=q->link;
//使p指向第i个结点
q->link=p->link;
//摘链
free§;
//释放结点p所占的空间
}
}

约瑟夫问题

15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。

#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int no;
struct node * next;
}NODE;

void main( )
{ int i, k; struct node *head, p, q;
head = (NODE
)malloc(sizeof(NODE));
head->no = -1;
head->next = head;
for ( i=30; i>0; i-- )
/
生成循环链表 */
{ p = (struct node )malloc(sizeof(struct node));
p->next = head->next; p->no = i; head->next = p;
}
printf("\nThe original circle is : ");
while ( p->next != head )
/
循环链跳过表头结点 /
p = p->next;
p->next = head->next;
/
p 指向 30 /
for ( i=0; i<15; i++ )
{ for ( k=1 ; k<9 ; k++ )
p = p->next;
q = p->next;
/
p 的下一个结点是要出列的结点 /
p->next = q->next;
/
循环链表跳过要出列的结点 /
printf("%3d", q->no);
/
输出 q 结点的编号 /
free(q);
/
释放 q 结点 */
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值