一. 数据结构三大要素:
-
1.逻辑结构
-
①线性:一对一
-
②非线性:一对多,多对多
-
2.存储结构
①顺序存储 :数据元素在内存中是一个挨一个的,连续存储
②链式存储 :数据元素在内存中是不连续存储的
③索引存储
3.算术
主要对数据的操作
二.顺序表
逻辑结构:线性
存储结构:顺序存储
操作:在任意位置操作删除表
三,单链表
逻辑结构:线性
存储结构:链式存储
操作:在任意位置操作删除表
main.c
#include "link_list.c"
int main(int argc, char const *argv[])
{
link_list_t *H=create_list();
if(NULL==H){
return -1;
}
data_t i;
while(1){
scanf("%d",&i);
if(-1==i){
break;
}
head_insert(H,i);//调用头部插入
}
show_list(H);
// pos_insert(H,1,10);
// pos_delete(H,1);
// change_data(H,10);
overturn_list(H);
show_list(H);
free_list(&H);
//show_list(H);
return 0;
}
link_list.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "link_list.h"
//申请空间
link_list_t *create_list(void){
link_list_t *L=(link_list_t *)malloc(sizeof(link_list_t));
//健壮性判断
if(NULL==L){
puts("创建链表失败");
return NULL;
}
//初始化空间
L->data=-1;
L->next=NULL;
//返回首地址
return L;
}
int head_insert(link_list_t *H,data_t value){
if(NULL==H){
puts("传入标参数非法");
return -1;
}
//申请数据节点
link_list_t *New=create_list();
if(NULL==New){
puts("传入标参数非法");
return -1;
}
//初始化数据节点
New->data =value;
New->next=NULL;
//头部插入操作
New->next=H->next;
H->next=New;
//完成返回
return 0;
}
int show_list(link_list_t *H){
if(NULL==H){
puts("传入标参数非法");
return -1;
}
if(NULL==H->next){
puts("为空表");
return -1;
}
link_list_t *q;
q=H->next;
while(q!=NULL){
printf("%d ",q->data);
q=q->next;
}
puts("");
return 0;
}
//尾部插入
int tail_insert(link_list_t *H,data_t value){
if(NULL==H){
puts("传入标参数非法");
return -1;
}
//创建新节点
link_list_t *New=create_list();
if(NULL==New){
puts("创建新节点失败");
return -1;
}
//初始化新节点
New->data=value;
New->next=NULL;
//遍历至链表尾部节点
link_list_t *q=H;
while(q->next!=NULL){
q=q->next;
}
q->next=New;
return 0;
}
int pos_insert(link_list_t *H,unsigned int pos,data_t value){
if(NULL==H){
puts("传入表参数非法");
return -1;
}
link_list_t *New=create_list();
if (NULL==New)
{
puts("创建新节点失败");
return -1;
}
New->data=value;
New->next=NULL;
link_list_t *q=H;
int i;
for(i=0;i<pos;i++){
q=q->next;
if(q==NULL){
puts("传入位置非法");
return -1;
}
}
New->next=q->next;
q->next=New;
return 0;
}
int pos_delete(link_list_t *H,unsigned int pos){
if(NULL==H){
printf("传入参数非法");
return -1;
}
link_list_t *q=H;
link_list_t *p;
int i;
for(i=0;i<pos;i++){
q=q->next;
if(q==NULL){
puts("传入位置非法");
return -1;
}
}
p=q->next;
q->next=p->next;
free(p);
p=NULL;
return 0;
}
int find_data(link_list_t *H,data_t value){
if(NULL==H){
puts("传入数据非法");
return -1;
}
if(NULL==H->next){
puts("为空表");
return -1;
}
link_list_t *q=H->next;
while(q!=NULL){
if(value==q->data){
puts("你查找的数据存在");
return q->data;
}
q=q->next;
}
puts("你查找的数据不存在");
return -1;
}
int change_data(link_list_t *H,data_t value){
if(NULL==H){
puts("传入数据非法");
return -1;
}
if(NULL==H->next){
puts("为空表");
return -1;
}
link_list_t *q=H->next;
while(q!=NULL){
if(value==q->data){
printf("已查到选择要修改的数据");
scanf("%d",&(q->data));
printf("修改完成");
return 0;
}
q=q->next;
}
puts("你查找的数据不存在");
return -1;
}
int overturn_list(link_list_t *H){
if(NULL==H){
puts("传入非法");
return -1;
}
if(NULL==H->next||NULL==H->next->next){
puts("为空表或只有一个元素");
return -1;
}
link_list_t *q=H->next->next;
H->next->next=NULL;
link_list_t *p;
while(q!=NULL){
p=q;
q=p->next;
p->next=H->next;
H->next=p;
}
puts("链表翻转完成");
return 0;
}
int free_list(link_list_t **H){
if(NULL==*H||NULL==H){
puts("传入表参数非法");
return -1;
}
link_list_t *q=*H;
while(NULL!=q){
q=(*H)->next;
printf("节点%d将被释放\n",(*H)->data);
free(*H);
*H=q;
}
return 0;
}
link_list.h
#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
typedef int data_t;
typedef struct node{
data_t data;
struct node *next;
}link_list_t;
//创建链表
link_list_t *create_list(void);
//头部插入
int head_insert(link_list_t *H,data_t value);
//尾部插入
int tail_insert(link_list_t *H,data_t value);
//遍历链表
int show_list(link_list_t *H);
//任意位置插入
int pos_insert(link_list_t *H,unsigned int pos,data_t value);
//删除任意位置
int pos_delete(link_list_t *H,unsigned int pos);
//查找节点
int find_data(link_list_t *H,data_t value);
//修改节点
int change_data(link_list_t *H,data_t value);
//链表翻转
int overturn_list(link_list_t *H);
//链表释放
int free_list(link_list_t **H);
#endif