顺序表
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构
特点 线性表的顺序存储方式
遍历 顺序访问, 可以随机存取
顺序表类似一维数组。
链表
链接表是线性表的链接存储表示
单链表的插入
1、在头插入
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_head(Link *head,Link new_node) //head为二级指针
{
new_node->next = *head;
*head = new_node;
}
void malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error.\n");
exit(-1);//退出程序
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
malloc_ok(*new_node);
(*new_node)->num = i;
}
if(p == *head)
{
new_node->next = *head;
*head = new_node;
}
else if(p->next == NULL && p->num != num_loc)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
}
void display(Link head)
{
Link p;
p = head;
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next; //指向下一个
}
}
int main()
{
Link head = NULL; //创建头指针。
Link new_node = NULL;//新结点的指针
int i;
int num_val,num_loc;
create_link(&head); //创建链表
for(i = 0; i < 10; i++)
{
create_node(&new_node,i);
//insert_node_head(&head,new_node); //头插。要改变head的值,要是二级指针才能改变。
}
display(head);
return 0;
}
2、尾部插入
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_tail(Link *head,Link new_node)
{
Link p;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
}
void malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error.\n");
exit(-1);//退出程序
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
malloc_ok(*new_node);
(*new_node)->num = i;
}
void display(Link head)
{
Link p;
p = head;
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next; //指向下一个
}
}
int main()
{
Link head = NULL; //创建头指针。
Link new_node = NULL;//新结点的指针
int i;
int num_val,num_loc;
create_link(&head); //创建链表
for(i = 0; i < 10; i++)
{
create_node(&new_node,i);
//insert_node_head(&head,new_node); //头插。要改变head的值,要是二级指针才能改变。
insert_node_tail(&head,new_node);
}
display(head);
return 0;
}
3、中间插入
1)在前面插入
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_tail(Link *head,Link new_node)
{
Link p;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
}
void malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error.\n");
exit(-1);//退出程序
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
malloc_ok(*new_node);
(*new_node)->num = i;
}
void insert_node_mid(Link * head,Link new_node, int num_loc)
{
Link p,q;
p = *head;
q = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->num != num_loc && p->next != NULL)
{
q = p;
p = p->next;
}
}
if(p == *head)
{
new_node->next = *head;
*head = new_node;
}
else if(p->next == NULL && p->num != num_loc)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
}
void display(Link head)
{
Link p;
p = head;
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next; //指向下一个
}
}
int main()
{
Link head = NULL; //创建头指针。
Link new_node = NULL;//新结点的指针
int i;
int num_val,num_loc;
create_link(&head); //创建链表
for(i = 0; i < 10; i++)
{
create_node(&new_node,i);
insert_node_tail(&head,new_node);
}
printf("请输入要插入的位置。\n");
scanf("%d",&num_loc);
printf("请输入要插入的数。\n");
scanf("%d",&num_val);
create_node(&new_node,num_val);
insert_node_mid(&head,new_node,num_loc);
display(head);
return 0;
}
2)在后面插入
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_tail(Link *head,Link new_node)
{
Link p;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
}
void malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error.\n");
exit(-1);//退出程序
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
malloc_ok(*new_node);
(*new_node)->num = i;
}
void insert_node_mid2(Link * head,Link new_node,int num_loc)
{
Link p;
Link q;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->num != num_loc && p->next != NULL)
{
p = p->next;
}
}
if(p->next == NULL && p->num != num_loc)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q = p->next;
p->next = new_node;
new_node->next = q;
}
}
void display(Link head)
{
Link p;
p = head;
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next; //指向下一个
}
}
int main()
{
Link head = NULL; //创建头指针。
Link new_node = NULL;//新结点的指针
int i;
int num_val,num_loc;
create_link(&head); //创建链表
for(i = 0; i < 10; i++)
{
create_node(&new_node,i);
insert_node_tail(&head,new_node);
}
printf("请输入要插入的位置。\n");
scanf("%d",&num_loc);
printf("请输入要插入的数。\n");
scanf("%d",&num_val);
create_node(&new_node,num_val);
insert_node_mid2(&head,new_node,num_loc);
display(head);
return 0;
}
4、链表的删除
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_head(Link *head,Link new_node) //head为二级指针
{
new_node->next = *head;
*head = new_node;
}
void insert_node_tail(Link *head,Link new_node)
{
Link p;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
}
void malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error.\n");
exit(-1);//退出程序
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
malloc_ok(*new_node);
(*new_node)->num = i;
}
void insert_node_mid(Link * head,Link new_node, int num_loc)
{
Link p,q;
p = *head;
q = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->num != num_loc && p->next != NULL)
{
q = p;
p = p->next;
}
}
if(p == *head)
{
new_node->next = *head;
*head = new_node;
}
else if(p->next == NULL && p->num != num_loc)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
}
void insert_node_mid2(Link * head,Link new_node,int num_loc)
{
Link p;
Link q;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->num != num_loc && p->next != NULL)
{
p = p->next;
}
}
if(p->next == NULL && p->num != num_loc)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q = p->next;
p->next = new_node;
new_node->next = q;
}
}
void node_del(Link * head,int num_val)
{
Link p,q;
p = *head;
q = *head;
if(p == NULL)
{
printf("链表为空!\n");
}
else
{
while(p->num != num_val && p->next != NULL)
{
q = p;
p = p->next;
}
if((*head)->num == num_val)
{
*head = (*head)->next;
free(p);
}
else if(p->next == NULL && p->num != num_val)
{
printf("没有找到数。\n");
}
else
{
q->next = p->next;
free(p);
}
}
}
void display(Link head)
{
Link p;
p = head;
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next; //指向下一个
}
}
int main()
{
Link head = NULL; //创建头指针。
Link new_node = NULL;//新结点的指针
int i;
int num_val,num_loc;
create_link(&head); //创建链表
for(i = 0; i < 10; i++)
{
create_node(&new_node,i);
insert_node_tail(&head,new_node);
}
printf("请输入要插入的位置。\n");
scanf("%d",&num_loc);
printf("请输入要插入的数。\n");
scanf("%d",&num_val);
create_node(&new_node,num_val);
insert_node_mid2(&head,new_node,num_loc);
display(head);
printf("请输入要删除的数。\n");
scanf("%d",&num_val);
node_del(&head,num_val);
display(head);
return 0;
}