线性表
具有唯一前驱和唯一后继的数据结构(头节点、尾节点例外)就是线性表
根据存储结构:
1.顺序表:在内存中连续存储(定义数组、malloc实现)
1.有空和满的状态
2.增加、删除的算法比较麻烦
3.修改和查询算法比较方便
2.链表: 在内存中随机存储不连续的链式结构(malloc开辟每一个节点,并将节点连在一起(将前一个节点里面的指针指向后一个节点))
1.有空的状态(只有头节点即空)但没有满的状态
2.链表增加或者删除比较简单
3.链表数据的查询和修改比较麻烦
顺序表
#include <stdio.h>
int main()
{
int arr[10]={0},tail=-1;
arr[++tail]=1;
arr[++tail]=2;
arr[++tail]=3;
arr[++tail]=4;
for(int i=0;i<=tail;i++)
printf("%d",arr[i]);
puts("");
}
顺序表较好的实现:
#include <stdio.h>
typedef struct data
{
int arr[100];
int tail;
}Data;
int insert_data(Data *p,int pose,int data)
{
if(pos<0||pos>p->tail||pos==100||NULL==p)
{
puts("arg err");
return -1;
}
for(int i=p->tail;i>pos;i--)
{
p->arr[i]=p->arr[i-1];
}
p->arr[pos]=data;
p->tail++;
return 0;
}
void show(Data *p)
{
for(int i=0;i<p->tail;i++)
printf("%d",p->arr[i]);
puts("");
}
int main()
{
Data list={0};
int data;
for(int i=0;i<10;i++)
{
printf("please input %d num\n",i);
scanf("%d",&data);
insert_data(&list,i,data)
}
show(&list);
return 0;
}
顺序表最好的实现(将表存在堆区):
list.h
#ifndef _LIST_H
#define _LIST_H
#include <stdio.h>
typedef struct data{
int *arr;
int tail;
int len;
}Data,*Pdata;
int init(Pdata *p,int len);
int insert_data(Pdata L,int poss,int data);
int delete_data(Pdata L,int pos);
int change_data(Pdata L,int pos,int data);
int select_data(Pdata L,int pos);
int empty(Pdata L);
int full(Pdata L);
void show(Pdata L);
#endif
list.c
#include "list.h"
#include <stdio.h>
int init(Pdata *p,int len)
{
*p=malloc(sizeof(Data));
if(NULL == *P)
{
perror("malloc");
return -1;
}
(*P)->arr = malloc(sizeof(int)*len);
if(NULL == (*P)->arr)
{
perror("malloc");
free(*P);
return -1;
}
(*P)->tail = 0;
(*P)->len = len;
return 0;
}
int insert_data(Pdata L,int pos,int data)
{
if(NULL==L)
return -1;
if(full(L))
return -1;
if(pos<0||pos>L->tail)
return -1;
for(int i=L->tail;i>pos;i--)
L->arr[i]=L->arr[i-1];
p->arr[pos]=data;
p->tail++;
return 0;
}
int delete_data(Pdata L,int pos)
{
if(NULL == L || empty(L) || pos < 0 || pos >= L->tail)
{
puts("delete arg err");
return -1;
}
int data = L->arr[pos];
for(int i = pos; i < L->tail; i++)
L->arr[i] = L->arr[i+1];
L->tail--;
return data;
}
int change_data(Pdata L,int pos,int data)
{
if(NULL == L || pos < 0 || empty(L) || pos >= L->tail)
{
puts("arg err");
return -1;
}
L->arr[pos] = data;
return 0;
}
int select_data(Pdata L,int pos)
{
if(NULL == L || empty(L) || pos < 0 || pos >= L->tail){
puts("select err");
return -1;
}
return L->arr[pos];
}
int empty(Pdata L)
{
if(NULL==L)
return 0;
if(0==L->tail)
return 1;
else
return 0;
}
int full(Pdata L)
{
if(NULL==L)
return 0;
if(L->len==L->tail)
return 1;
else
return 0;
}
void show(Pdata L)
{
if(NULL==L||empty(L))
return;
for(int i=0;i<L->tail;i++)
printf("%d",L->arr[i]);
puts("");
}
mian.c
#include <stdio.h>
#include "list.h"
int mian()
{
int data,num,ret,pos=0;
xxx:
puts("please input list num");
scanf("%d",&num);
if(0>num)
{
puts("input err");
goto xxx;
}
Pdata p=NULL;
init(&p,num);
while(1){
printf("please input data:");
ret=scanf("%d",&data);
if(0==ret)
break;
insert_data(p,pos,data)
pos++;
}
getchar();
show(p);
printf("please input delete data--->pos: ");
scanf("%d", &pos);
printf("%d deleted!\n", delete_data(p, pos));
show(p);
return 0;
}
自己写的程序 DS->day2里