单链表的创建、删除结点、插入新结点、遍历但链表。很多不足之处,希望多多提意见改正:
1、链表
1) 单链表的创建
首先创建一个节点,将头结点、q临时节点、创建节点p。都指向这个节点。
接下来循环创建链表的每个节点,为了实现人机交互,最好在创建每个节点的时候都询问是否创建节点,创建下一个单独节点结束之后。然后让q的下一个节点指向p这样就建立起了中间链接,然后让q指向p节点。这样依次循环,就创建好了一个单链表。
具体的代码:
struct student *creat_line(void)
{
struct student *head;
struct student *p;
struct student *q;
char c[2];
int num;
num = 0;
p=(struct student*)malloc(sizeof(struct student));
if(p!=NULL){
scanf("%s%d", p->name, &p->num);
}
printf("do you want to creat y/n\n");
scanf("%s", c);
num++;
head = p;
q = p;
do{
p = p->next;
p=(struct student*)malloc(sizeof(struct student));
if(p!=NULL){
scanf("%s%d", p->name, &p->num);
}
printf("do you want to creat y/n\n");
scanf("%s", c);
num++;
q->next = p;
q = p;
}while(c[0]=='y');
p = NULL;
return head;
}
2) 链表节点的删除
在各种笔试题目中最常见的就是链表节点的删除,其实觉得和很奇怪,为什么总是喜欢考这个呢,感觉好像期末考试一样。
删除节点,其实要分是不是删除头结点的问题,如果是删除头节点,那就直接将头节点的下一个节点视为头节点,然后删除头节点就可以了。
如果不是删除头节点,就先锁定需要删除的节点的前一个节点q,然后将q->next指向p->nextj然后删除p节点。
p->next=q->next;delete q;
具体程序如下:
struct student *delete_point(struct student *head, int del_num)
{
struct student *p;
struct student *q;
p = head;
if(del_num==head->num){
head = head->next;
}else{
while(p!=NULL){
if((p->next)->num==del_num){
q = p->next;
p->next = q->next;
free(q);
break;
}
p = p->next;
}
}
return head;
}
New需要删除,如果是malloc就直接free就可以了。
3) 遍历链表
首先是一个节点指向头节点,然后依次指向下一个节点
void view_line(struct student *head)
{
struct student *p;
p = head;
while(p!=NULL){
printf("%s %d\n", p->name, p->num);
p = p->next;
}
}
4) 链表节点的插入
插入节点,分在前面插入和在后面插入,这里只是做了在指定节点后面插入新的节点。
先产生一个节点,让新产生的节点指向指定节点的下一个节点,建立连接,然后使得指定节点指向新建的节点,这样就连接起来了,是不是很简单呢!
struct student *insert_point(struct student *head, int insertnum)
{
struct student *p;
struct student *q;
p = (struct student *)malloc(sizeof(struct student ));
scanf("%s%d", p->name, &p->num);
q = head;
while(q!=NULL){
if(q->num==insertnum){
q->next = p->next;
q->next = p;
break;
}
q = q->next;
}
return head;
}
源代码下载:http://download.csdn.net/detail/u012789847/9063209