如何用C语言创建一个链表,实现增、删、改、查?

Python012

如何用C语言创建一个链表,实现增、删、改、查?,第1张

#include\x0d\x0a#include\x0d\x0a#include \x0d\x0a//先定义一种student类型,表示一个学生的信息,如下:\x0d\x0atypedef struct student\x0d\x0a{\x0d\x0aint num//表示学号\x0d\x0achar name[30]//表示姓名\x0d\x0afloat score//表示分数\x0d\x0a}student\x0d\x0a//定义一种NODE类型,表示一个结点信息,如下:\x0d\x0atypedef struct node\x0d\x0a{\x0d\x0astudent st//表示一个学生的信息\x0d\x0astruct node *next//表示一个NODE类型的指针\x0d\x0a}NODE\x0d\x0a//1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:\x0d\x0aNODE *creat_link(int direction)\x0d\x0a{\x0d\x0aNODE *head,*p,*tail\x0d\x0aint xh,i=1\x0d\x0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部\x0d\x0a{\x0d\x0atail=head=(NODE *)malloc(sizeof(NODE))\x0d\x0ahead->next=NULL\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE))\x0d\x0ap->st.num=xh\x0d\x0aprintf("请输入第%d个学生的姓名:",i)\x0d\x0ascanf("%s",p->st.name)\x0d\x0aprintf("请输入第%d个学生的成绩:",i)\x0d\x0ascanf("%f",&p->st.score)\x0d\x0ap->next=NULL\x0d\x0atail->next=p\x0d\x0atail=p\x0d\x0ai=i+1\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0a}\x0d\x0a}\x0d\x0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点\x0d\x0a{\x0d\x0ahead=(NODE *)malloc(sizeof(NODE))\x0d\x0ahead->next=NULL\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE))\x0d\x0ap->st.num=xh\x0d\x0aprintf("请输入第%d个学生的姓名:",i)\x0d\x0ascanf("%s",p->st.name)\x0d\x0aprintf("请输入第%d个学生的成绩:",i)\x0d\x0ascanf("%f",&p->st.score)\x0d\x0ap->next=head->next\x0d\x0ahead->next=p\x0d\x0ai=i+1\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0a}\x0d\x0a}\x0d\x0areturn head\x0d\x0a}\x0d\x0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:\x0d\x0avoid print_link(NODE *head)\x0d\x0a{\x0d\x0aNODE *p\x0d\x0ap=head->next\x0d\x0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数")\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score)\x0d\x0ap=p->next\x0d\x0a}\x0d\x0a//该函数能输出head所指的链表的所有结点值,输出形式如下:\x0d\x0a/*本函数输出线性表sq中所有数据,形式如下:\x0d\x0a学号 姓名 分数\x0d\x0a12 张三 234.5\x0d\x0a18 李四 987.7\x0d\x0a??? ??? ??.*/\x0d\x0a}\x0d\x0a//3、写出在链表中删除结点的函数\x0d\x0aint del_link(NODE *head,char name[])\x0d\x0a{\x0d\x0aNODE *p,*p1\x0d\x0ap=head->next\x0d\x0ap1=head\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aif(strcmp(p->st.name,name)!=0)\x0d\x0a{\x0d\x0ap1=p\x0d\x0ap=p->next\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0abreak\x0d\x0a}\x0d\x0a}\x0d\x0aif(p!=NULL)\x0d\x0a{\x0d\x0ap1->next=p->next\x0d\x0afree(p)\x0d\x0areturn 1\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0areturn 0\x0d\x0a}\x0d\x0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0\x0d\x0a}\x0d\x0a//4、写出在链表中插入结点的算法\x0d\x0aint insert(NODE *head,student x,int wz)\x0d\x0a{\x0d\x0aNODE *p=head\x0d\x0aint i=0,jg\x0d\x0aif(wznext\x0d\x0a}\x0d\x0aif(p==NULL)\x0d\x0a{\x0d\x0ajg=0\x0d\x0a}\x0d\x0aif(i=wz-1)\x0d\x0a{\x0d\x0a//找到wz前面的节点,p指向它\x0d\x0aNODE *q\x0d\x0aq=(NODE *)malloc(sizeof(NODE))\x0d\x0aq->st.num=x.num\x0d\x0astrcpy(q->st.name,x.name)\x0d\x0aq->st.score=x.score\x0d\x0aq->next=p->next\x0d\x0ap->next=q\x0d\x0ajg=1\x0d\x0a}\x0d\x0a}\x0d\x0areturn jg\x0d\x0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。\x0d\x0a}\x0d\x0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。\x0d\x0avoid main()\x0d\x0a{\x0d\x0aNODE *head//定义指针变量head\x0d\x0aint wz//表示插入位置\x0d\x0achar xm[30]\x0d\x0astudent st//定义一个变量st,用来表示一个学生的信息\x0d\x0ahead=creat_link(1)\x0d\x0aprint_link(head)//调用函数建立链表,并把返回值送给head\x0d\x0a//调用函数,输出链表中各个结点的值\x0d\x0a//输入一个学生的有关信息,送给变量st的有关成员\x0d\x0aprintf("\n\n请输入要插入的位置:")\x0d\x0ascanf("%d",&wz)//输入wz的值\x0d\x0aprintf("请输入要插入的学生的学号:")\x0d\x0ascanf("%d",&st.num)\x0d\x0aprintf("请输入要插入的学生的姓名:")\x0d\x0ascanf("%s",st.name)\x0d\x0aprintf("请输入要插入的学生的成绩:")\x0d\x0ascanf("%f",&st.score)\x0d\x0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表\x0d\x0aif(insert(head,st,wz)==1)\x0d\x0a{\x0d\x0aprintf("\n插入成功,新表为:\n")\x0d\x0aprint_link(head)\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("插入不成功")\x0d\x0a}\x0d\x0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表\x0d\x0aprintf("\n\n请输入要删除的学生的姓名:")\x0d\x0agetchar()\x0d\x0agets(xm)\x0d\x0aif(del_link(head,xm)==1)\x0d\x0a{\x0d\x0aprintf("\n删除成功,新表为:\n")\x0d\x0aprint_link(head)\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("删除不成功")\x0d\x0a}\x0d\x0a}

方法如下:

1.头文件:

#include

#include

#include//这个是必需要包含的,下面对mysql的所有操作函数,都出自这里

2.定义一个MYSQL变量:

MYSQLmysql;

这里MYSQL是一个用于连接MySql数据库的变量。

在后面对mysql数据库的操作中,我们就用这个MYSQL变量作为句柄的。

3.定义数据库参数:

charhost[32]=”localhost”

charuser[32]=”username”

charpasswd[32]=”pwd”

chardbname[32]=”testdb”

4.数据库操作

1).初始化数据库:

mysql_init(&mysql);

2).连接数据库:

mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0);

我们在操作时,可以对以上的函数进行if测试,如果初始化或者连接出错,作出相应提示,以便调试。

5.对数据库的操作:

Mysql_query(&mysql,“select*fromtestdbwherecondition”)

我们在实际操作中,为了更方便的使用程序中的某些变量,我们将会用到一个函数:

intsprintf(char*str,constchar*format,?)

这个函数用来格式化我们的字符串,然后将变量按照给你的格式,赋给第一个参数。

我们使用这个方法方法可以很方便的使用我们的变量来对数据库进行操作。例如我们将要进行数据库的查询操作,我们就可以这样使用:

sprintf(sql,”select*fromtestdbwhereusername=‘%s’”,u_name)

然后使用mysql_query(&mysql,sql)进行查询。

MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。