线性表
一.概念
某一类相同特性的元素组成的连续线性排列的表 //每个节点中存放数据类型必须相同
1.逻辑结构:
元素有一对一关系 //连续线性
2.物理结构[存储结构]:
顺序存储结构--在内存中开辟连续存储空间,逻辑上线性与物理上线性一致 //eg:数组
优点:a.查找速度快;b.改同查; c.简单直观
缺点:a.内存创建不灵活[大小难确定]; b.删除操作消耗时间长[需要向上拷贝过程]; c.增同删;
链式存储结构--用一组连续or不连续的存储单元储存线性表,通过数据之间的指针来实现逻辑关系。
优点:a.增删改查操作快; b.动态分配内存方便
缺点:暂无
二.节点 node --链表中的数据单位
包括数据域和指针域[指向下一个节点]
eg:
struct node{
data;
struct node *next;
}
三.单链表--每个节点只包含一个指针域
1.基本概念
前驱:相对本node之前node
后继:相对本node之后node
typedef struct stu{
int number;
char name[12];
struct stu *next;
}student; //定义学生节点
student* create(){
student* head; //指向链表头的指针
int data_num;
char data_name[12];
student *new; //新节点
student *p; //指向最后一个节点
int i;
head=malloc(sizeof(student)); //给头节点分配内存
if(head==NULL){ //判断分配内存是否成功
printf("Failed");
return NULL;
}
else{ //内存分配成功操作头节点
data_num=1;
scanf("%s",data_num);
head->number=datqa_num; //以下赋值给头节点
strcpy(head->name,data_name);
head->next=NULL; //在产生新node 时再赋值
p=head; //为新增节点服务
/*头节点需要单独做,其他节点可以利用循环完成*/
while(1){
data_num++;
new=malloc(sizeof(student));
scanf("%s",data_name);
//中间自行加一步判断退出
new->number=data_num;
strcpy(new->name,data_name);
new->next=NULL;
p->next=new; //此时p还指向上一node,上衣node 的 *next==当前node地址
p=new; //另 p指向当前节点地址
}
}
}
2.有头链表and无头链表
带头节点的单链表:为操作方便,在原链表的原头node前加一node,指向原头node。
无头~:第一node为头node
3.对链表的操作
增
int insert(student *head,char *qname,char *iname,int ino)
{
student *p,*new;
p=head->next;
while(p!=NULL)
{
if(!strcmp(p->name,qname))
{
new=malloc(sizeof(student));
new->number=ino;
strcpy(new->name,iname);
new->next=p->next;
p->next=new;
return 1;
}
p=p->next;
}
return 0;
}
删
student* delete(student *head,char *dname)
{
student *p;
student *back;
p=head;
while(1)
{
back =p;
p=p->next;
if(!strcmp(p->name,dname))
{
back->next=p->next;
free(p);
break;
}
if(p!=NULL && p->next==NULL)
{
break;
}
}
return head;
}
查
int query(student *head,char *qname)
{
student *p;
p=head->next;
while(p!=NULL)
{
if(!(strcmp(p->name,qname)))
{
printf("p->number=%d\n",p->number);
printf("p->name=%s\n",p->name);
return 1;
}
p=p->next;
}
return 0;
}
改
改的主旨就是如上查到,修改查到内容即可
毁
void destroy(student *head)
{
student *p;
while(head != NULL)
{
p=head;
head=head->next;
free(p);
}
}