C语言—双链表操作

双链表操作

/*双链表的操作:查询、删除、显示、插入。

*双向链表克服单向链表向前查找结点需要执行时间O(n)的缺点

*2008.1.17

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define N 10

typedef struct node *ptNode;

struct node

{

char name[20];

ptNode lLink,rLink;

};/*双链表的结构定义*/

/*双链表的创建*/

ptNode Creat(int n)

{

ptNode head,ptr,newnode;

int i;

if((head=(ptNode)malloc(sizeof(node))) == NULL)

{

printf("cannot find space!\n");

exit(0);

}

head->name[0] = '\0';//头结点初始化

head->lLink = NULL;

head->rLink = NULL;

ptr = head;

for(i=0; i<n; i++)

{

if((newnode=(ptNode) malloc(sizeof(node))) == NULL)

{

printf("cannot find space!\n");

exit(0);

}

ptr->rLink = newnode;//连接新结点

printf("Please input the %d man's name: ",i+1);

scanf("%s",newnode->name);

newnode->lLink = ptr;//定义newnode的连接关系

newnode->rLink = NULL;

ptr = newnode;

}//end for

head->lLink = newnode;

ptr->rLink = head;

return(head);

}

/*查找名字的位置*/

ptNode Search(ptNode head,char *pEle)

{

ptNode ptr;

char *pTemp;

ptr = head->rLink;

while(ptr != head)//以是否回到头结点为结束条件

{

pTemp = ptr->name;//pTemp暂存结点的名字地址

if(strcmp(pTemp,pEle) == 0)

{

return(ptr);

}

else

{

ptr = ptr->rLink;//指向下一结点

}

}

printf("cannot find data!\n");

return NULL;

}

//在选定名字前插入

void Insert(ptNode head,char *prior,char *insertEle)

{

ptNode ptr,newnode;

if((ptr=Search(head,prior)) ==NULL)

{

printf("Can't find the data to insert!\n");

exit(0);

}

if((newnode=(ptNode)malloc(sizeof(node))) == NULL)

{

printf("Can't arrange memory space!\n");

exit(0);

}

strcpy(newnode->name,insertEle);//给新结点加载值

newnode->lLink = ptr->lLink;//前指针指向前结点,先处理以新结点为中心前后关系

newnode->rLink = ptr;//新结点后指针指向定位结点

(ptr->lLink)->rLink = newnode;//前结点的由指针指向新结点

ptr->lLink = newnode;

}

/*打印输出*/

void Print(ptNode head)

{

ptNode ptr;

ptr = head->rLink;

printf("\nNow the double list is:\n");

while(ptr != head)

{

printf("%s ",ptr->name);

ptr = ptr->rLink;

}

printf("\n");

}

/*删除*/

void Delete(ptNode ptr)

{

(ptr->rLink)->lLink = ptr->lLink;//(ptr->rLink)->lLink下一结点的左指针被赋前指针

(ptr->lLink)->rLink = ptr->rLink;

free (ptr);

}

/*主函数*/

void main(void)

{

int number;

char studName[20];

char insertName[20];

ptNode head,searchpoint;

number = N;

puts("Please input the size of the list:");

scanf("%d",&number);

head = Creat(number);

Print(head);

printf("\nPlease input the name which you want to find:\n");

scanf("%s",studName);

searchpoint = Search(head,studName);

printf("the name you want to find is:%s\n",searchpoint->name);

Delete(searchpoint);

Print(head);

printf("Before which element do you want to insert:\n");

scanf("%s",studName);

printf("Enter the student name you want to insert:\n");

scanf("%s",insertName);

Insert(head,studName,insertName);

Print(head);

puts("\n");

}

(0)

相关推荐

  • 链表常见的题型和解题思路

    链表常见的题型和解题思路

  • 双链表的操作示例(附代码)

    什么是双链表? 双链表是在操作系统中常用的数据结构,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,其结点组成如下: 其示意图举例如下: 双链表的操作示例 1.双链表结点定义: /* 数据 ...

  • Go语言中切片操作的那些技巧

    Go语言中文网 今天 以下文章来源于李文周 ,作者李文周 李文周一个北漂程序员的自我更新之旅. 本文翻译自官方wiki,整理了Go语言中关于切片操作的一些技巧. 备注:由于行文需要,一些细节与原文存在 ...

  • 【C语言】内存操作经典问题分析,野指针的初步探析!

    野指针 ● 指针变量中的值是非法的内存地址,进而形成野指针: ● 野指针不是 NULL 指针,是指向不可用内存地址的指针: ● NULL 指针并无危害,很好判断,也很好调试: ● C 语言中无法判断一 ...

  • 双链表,这回彻底搞dong了

    前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以单链表为主,但实际上在实际应用中双链表的应用多一些就比如LinkedList. 双链表与单链表区别 逻辑上它们均是线性表的链式实现,主要的 ...

  • C语言题库操作题视频解析+(下部)颠覆传统,再不枯燥:好玩,易学,易懂,易会

    说是课,但完全可以作为一种娱乐项目来观赏,因为,很有趣.很好玩,和你通常认识的C语言课,很不一样,很不一样,很不一样(重要的话说三遍) 二级C语言(下部)来啦 计算机二级C语言教学视频: 你是否以前尝 ...

  • 双赢操作!他因无缘恒大门将主力,一拍即合加盟申花已成绝对核心

    上海申花这几个赛季一直被门将问题困扰,为此球迷多次呼吁球队能在这个位置补强.申花之前门将位置有国门王大雷,球迷就根本不用为这个位置发愁.后来申花运营资金出现了很大问题,球队不得不通过卖主力球员换取运营 ...

  • 双赢操作!王牌尖刀加盟泰达已得到德转确认,曾被誉为武磊接班人

    北京时间2月26日讯,据德国<转会市场>中国区管理员朱艺确认,申花阵中的U23前锋刘若钒租借加盟天津泰达,租借费用为62.4万欧元(475.9万元),合同签至今年年末.从泰达给申花的租借费 ...

  • 【C语言笔记】操作位的技巧

    操作位有两种方法,一种是位字段,另一种是使用按位运算符.位字段的方法可查看往期笔记:[C语言笔记]位域.本文介绍使用按位运算符操作位的方法.下表为几种位操作符及其含义: 不改变其他位的值的状况下,对某 ...

  • 【RT-Thread笔记】对象容器与双链表

    前言 在我们嵌入式中,可能会有些人认为数据结构与算法相关知识没什么用,很少用得上. 以前,我也是这么认为的,那东西那么难学,好像又用不上,学了有什么用,干脆就不学了. 直到后面深入学习一些东西之后发现 ...