线性表

一.概念

某一类相同特性的元素组成的连续线性排列的表 //每个节点中存放数据类型必须相同

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);

}

}