一步一步复习数据结构和算法基础-双链表
2012-07-26 14:34
696 查看
单链表只能直接查找一个节点的后继,而双链表可以同时直接查找一个节点的前驱的后继。
加上新的功能:
交换相邻元素但是通过交换指针来进行。
void swap(Linklist head,int key)
{
Linklist tmp,p1,p2;
tmp = head->rlink;
while(tmp)
{
if(tmp->rlink->data == key)break;
tmp = tmp->rlink;
}
if(tmp->rlink->rlink == NULL)exit(1);
p1 = tmp->rlink;
p2 = p1->rlink;
p1->rlink = p2->rlink;
if(p2->rlink != NULL)
p2->rlink->llink = p1;
p1->llink = p2;
p2->rlink = p1;
tmp->rlink = p2;
p2->llink = tmp;
}
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *llink,*rlink; //llink 前驱 rlink后继 }*Linklist,Node; //初始化双链表 void IiniLlist(Linklist* head) { (*head) = (Linklist)malloc(sizeof(Node)); (*head)->llink = (*head)->rlink = NULL; } //创建双链表 Linklist CreatList(Linklist head) { int number; Linklist tmp,k; k = head; printf("输入数据:\n"); while(scanf("%d",&number) != EOF) { tmp = (Linklist)malloc(sizeof(Node)); if(tmp) { tmp->data = number; tmp->rlink = k->rlink; if(k == head)tmp->llink = NULL; else tmp->llink = k; k->rlink = tmp; k = k->rlink; } } return head; } //在pos位置后插入数据data void InsertList(Linklist head,int pos,int data) { Linklist temp = head,digit; int flag=0; if(pos < 0 || pos > GetLength(head))return; //注意在链表表尾数据的插入比较特殊 while(temp) { if(pos == flag && flag == GetLength(head)) { digit = (Linklist)malloc(sizeof(Node)); digit->data = data; digit->rlink = temp->rlink; temp->rlink = digit; digit->llink = temp; } else if(pos == flag) { digit = (Linklist)malloc(sizeof(Node)); digit->data = data; digit->rlink = temp->rlink; temp->rlink->llink = digit; //表尾数据的rlink为NULL没有llink temp->rlink = digit; digit->llink = temp; } flag++; temp = temp->rlink; } } //删除pos位置的数据 void DeleteList(Linklist head,int pos) { Linklist temp = head; int flag=0; if(pos < 1 || pos > GetLength(head))exit(1); while(temp) { if(pos == flag) { temp->rlink->llink = temp->llink; temp->llink->rlink = temp->rlink; free(temp); break; } flag++; temp = temp->rlink; } } //获取双链表的长度 int GetLength(Linklist head) { int result=0; Linklist temp = head->rlink; while(temp) { result++; temp = temp->rlink; } return result; } //输出链表 void PrintList(Linklist head) { Linklist tmp = head->rlink; while(tmp) { printf("%d ",tmp->data); tmp = tmp->rlink; } printf("\n"); } int main() { Linklist head; IiniLlist(&head); head = CreatList(head); InsertList(head,4,11); DeleteList(head,4); PrintList(head); return 0; }
加上新的功能:
交换相邻元素但是通过交换指针来进行。
void swap(Linklist head,int key)
{
Linklist tmp,p1,p2;
tmp = head->rlink;
while(tmp)
{
if(tmp->rlink->data == key)break;
tmp = tmp->rlink;
}
if(tmp->rlink->rlink == NULL)exit(1);
p1 = tmp->rlink;
p2 = p1->rlink;
p1->rlink = p2->rlink;
if(p2->rlink != NULL)
p2->rlink->llink = p1;
p1->llink = p2;
p2->rlink = p1;
tmp->rlink = p2;
p2->llink = tmp;
}
相关文章推荐
- 一步一步复习数据结构和算法基础-斐波那契查找法
- 一步一步复习数据结构和算法基础-二叉排序树
- 一步一步复习数据结构和算法基础-链表(3)
- 一步一步复习数据结构和算法基础-栈和队列(2)
- 一步一步复习数据结构和算法基础-栈的简单应用(1)
- 一步一步复习数据结构和算法基础(1)
- 一步一步复习数据结构和算法基础-栈的应用(2)
- 一步一步复习数据结构和算法基础-二叉树基本操作
- 一步一步复习数据结构和算法基础-堆排序
- 一步一步复习数据结构和算法基础-dijkstra算法
- 一步一步复习数据结构和算法基础-链表(2)
- 一步一步复习数据结构和算法基础-图的创建和基本操作(邻接矩阵)
- 一步一步复习数据结构和算法基础-中序线索二叉树
- 一步一步复习数据结构和算法基础-后序线索二叉树
- 一步一步复习数据结构和算法基础-prim算法(最小生成树)
- 一步一步复习数据结构和算法基础-哈希表的链地址表示
- 一步一步复习数据结构和算法基础-KMP算法
- 一步一步复习数据结构和算法基础-堆分配存储表示串
- 一步一步复习数据结构和算法基础-插入排序(1)
- 一步一步复习数据结构和算法基础-循环链表