链表

1. 单链表

 

单链表的动态数据结构的声明:

 

typedef   char  datatype;

typedef  struct  node{

        datatype  data;

        struct   node  *next;

}listnode, *linklist;

//typedef  listnode  *linklist;

 //       listnode  *p;

        linklist  head;           // head为指针名,把链表称为表head

 

单链表的建立:

 

linklist createl_single_list(void){

   char ch = getchar();

   linklist head = null;

   listnode *p;

   while(ch! = ’/n’){

      p=(listnode*)malloc(sizeof(listnode));

      p->data = ch;

      p->next = head;

      head = p;

      ch=getchar();

}

return(head);

}//表头插入法,生成的链表中结点的次序和输入的顺序相反。

linklist cerat_single_list2( ){

char ch;

linklist head;

listnode *p, *q ;

head = q= null; //r为链表的尾指针;

while((ch = getchar()) != ‘/n’ ){

    p = (listnode*)malloc(sizeof(listnode));

    p->data = ch;

    if(head = null)

head = p;

    else

 q->next = p;

        q= p;

}

if(q != null) q->next = null;

return head;

}//表尾插入;

 

单链表的查找:

 

listnode *get_node(linklist head, int i){

int j;

listnode *p;

p = head;      //可能找头结点,从j0开始找;

j = 0;

while(p->next&&j<i){

p = p->next;

j++;

}

If(i = j)

    return p;

else

    return null;

}//按序号查找

 

listnode *locate_node(linklist head, int key){

listnode *p = head->next;   //头节点没有值

while(p && p->data != key)

    p = p->next;

   return p;

}//按值查找,值是整型值

 

单链表的插入:

 

void insert_node(linklist head, int x, int i){ // 之前插入整数x,即 之间;

listnode *p, *q;

p = get_node(head, i-1);

if(p = null)

    error(“position  error”);

q = (linknode*)malloc(sizeof(linknode));

q->data = x;

q->next = p->next;

p->next = q;

}//设链表的长度为n,合法的插入位置是1in+1

 

单链表的删除

 

void del ete_node(linklist head, int i){

listnode *p, *q;

p = get_node(head, i-1)

if(p = = null || p->next = = null)  //p结点不能是尾结点

    return -1;

q = p->next;

p->next = q->next;

free(q);

}//删除i位置的结点;

 

单链表的长度:

 

int length(linklist head){

int k=0;

listnod *p;

p = head; //把头结点算上,注意头指针和头结点区别,头结点没有数据值;

while(p -> next){

    p = p -> next;

    k++;

}

return k;

}

 

链接两个单链表headaheadb:

 

void connect_list (linklist heada, linklist headb, linklist &headc) {

 //把链表hb接在ha后面形成链表hc
     headc = heada; p = heada;
      while(p -> next) p = p -> next;
      p -> next = hb;
}//connect_list

 

单链表的转置

 

linklist reverse_list(linklist head){

listnode *p, *q;

if(head ->head&&head ->next -> next){//至少有两个结点,除头结点外;

    p = head -> next;

    q = p -> next;

    p -> next = null;//把开始结点变成尾结点;

    while(q){

   p = q;

   q = q ->next;

   p ->next = head -> next;

   head -> next = p;  //使每次的p结点插入到head后面;

}

    return  head;

}

return head;

}

 

 

2. 循环链表

 

1)单循环链表

单循环链表的基本操作于单链表的相似,只是要注意多考虑一步,尾结点指向的是头结点。

//实际中多采用尾指针表示单循环链表,因为查找开始结点和终端结点都方便,它们的存储位置分别是(rear–>next) —>nextrear,查找时间都是O(1)

 

链接两个单循环链表headaheadb

 

linklist  connect_list(linklist heada, linklist headb){  //heada headb表示的都是尾结点

linklist p;

p = heada->next;

heada->next = (headb->next)->next;

free(headb->next);

headb->next = p;

return(headb);

}//

 

单循环链表表示稀疏矩阵

 

结构声明:

typedef  int  datatype

struct matrix_list{

int row;

int col;

datatype data;

struct matrix_list *right;

struct matrix_list *down;

}matrix_node, *matrix_list;

 

2)双链表

 

双链表的动态数据结构的声明:

 

typedef   char  datatype;

typedef struct d_listnode{

datatype data;

    struct d_listnode *prior, *next;

}d_listnode, d_linklist, head;

   //typedef d_listnode * dlinklist;

   // dlinklist head;

 

双链表的建立

 

d_linklist create_d_list(void){

    char ch = getchar();

d_linklist head = null;

d_listnode *p, *q;

p = (d_listnode *)malloc(sizeof(d_listnode)); //建立头结点;

head = p ;

while(ch != ‘/n’){

    q = (d_listnode *)malloc(sizeof(listnode));

    q -> data = ch;

    p -> right = q;

    q -> left = p;

    p = q;

}

return head;

}//表尾插入的,带头结点的链;

 

双链表的前插

 

void d_insert_befor(d_listnode *p, datatype x){

d_listnode *q = malloc(sizeof(d_listnode));

q -> data = x;

q -> prior = prior;

q -> next = p;

p -> prior -> next = q;

p ->prior = q;

}

双链表的查找:

 

listnode *locate_d_node(linklist head, int key){

listnode *p = head->next;   //头节点没有值

while(p && p->data != key)

    p = p->right;

   return p;

}//按值查找,值是整型值

 

双链表的删除

 

void d_delete_node(d_listnode *p){

p -> prior -> next = p -> next;

p -> next -> prior = p -> prior ;

free(p);

}

 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值