c语言 建立一个链表,实现增删改查

c语言 建立一个链表,实现增删改查,第1张

下面是以前写的一个关于链表的综合 *** 作,你可以看看,应该可以满足你的要求。

/

created: 2009/09/15

created: 16:9:2009 17:20

filename: E:\dd\lianbiao\lianbiaocpp

author:

purpose: 一个win32 的控制台程序

实现单项链表的数据删除、插入、排序等功能

/

#include <stdioh>

#include "windowsh"

#include "malloch"

#define LEN sizeof(struct student)

#define NULL 0

#define N 5 //N为所要创建的链表的长度

int n = 0; //定义全局变量n,表示链表的节点个数

/

Author/data: /2009/09/15

Description: 声明一个结构体作为链表的节点

tip: student 只是一个标签,是不能声明变量的

/

struct student

{

int num;

float cj;

struct student Pnext;

};

/

Author/data: /2009/09/15

Description: 创建一个动态链表

参数: 返回链表的第一个节点的地址

x 为链表的长度

/

struct student pa(int x)

{

struct student head;

struct student p1,p2;

// n = 0;

p1 = p2 = (struct student )malloc(LEN); //开辟一个结构体内存

fflush(stdin); // 清除缓冲区数据 避免直接读入缓冲区数据

scanf("%d,%f",&p1->num,&p1->cj);

head = NULL;

while(p1->Pnext != NULL)

{

n = n+1;

if(n == 1)

{

head = p1; // 链表的头地址

}

else

{

p2->Pnext = p1; //链接链表数据

}

/ 判断是否最后一个 /

if(n >= x)

{

p1->Pnext = NULL;

}

else

{

p2 = p1;

p1 = (struct student )malloc(LEN);

fflush(stdin);

scanf("%d,%f",&p1->num,&p1->cj);

}

}

return(head);

}

/

Author/data: /2009/09/15

Description: 输出一个链表

参数: head为第一个节点的地址

/

void print(struct student head)

{

struct student p;

int i = 0;

printf("\nNow,These %d records are:\n",n);

p = head;

if(head != NULL) // 如果链表不是空的,则进行数据输出

{

do

{

printf("%d\t",i++);

printf("%5d %51f\n",p->num,p->cj); // 输出链表数据

p = p->Pnext;

}while(p != NULL);

}

}

/

Author/data: /2009/09/16

Description: 释放动态链表的地址空间

参数: 链表的头地址head

无返回值

/

void freelinkspace(struct student head)

{

struct student Ltemp;

LtempPnext = head->Pnext; // Ltemp 用来存放->next,避免空间被

// 释放后,找不到下一个结点的地址

while(head->Pnext != NULL) // 判断是否已经空间释放到最后一个

{

free(head);

head = LtempPnext;

LtempPnext = head->Pnext;

}

free(head); // 释放最后一个结点空间

}

/

Author/data: /2009/09/15

Description: 删除链表链表中的一个结点

参数: head 为第一个节点的地址

num 为要删除结点的序号(head->num)

/

struct student del(struct student head,int num)

{

struct student p1,p2;

p1 = head;

while(p1->num!=num && p1->Pnext!=NULL) // 寻找要删除的结点

{

p2 = p1; // p2 存放删除结点的前一个结点地址

p1 = p1->Pnext; // p1 存放要删除的结点

}

if(num == p1->num) // 是否找到要删除结点

{

if(p1 == head) // 删除的是第一个结点

{

head = p1->Pnext;

}

else if(p1->Pnext == NULL) // 删除的是最后一个结点

{

p2->Pnext = NULL;

}

else // 删除中间的结点

{

p2->Pnext = p1->Pnext;

p1->Pnext = NULL;

}

printf("delete: %d\n",num);

n = n-1; // 链表长度 - 1

}

else

{

printf("%d not been found! \n",num);

}

delete(p1);

return(head);

}

/

Author/data: /2009/09/16

Description: 添加一个结点到链表中

参数: head 为第一个结点的地址指针

stud 为要插入的结点的地址指针

/

struct student insert(struct student head,struct student stud)

{

struct student p0,p1,p2;

p0 = stud;

p1 = head;

while(p0->num>p1->num && p1->Pnext!=NULL) // 找到添加结点的位置

{

p2 = p1; // p2 存放要添加的前一个结点的地址

p1 = p1->Pnext; // p1 存放要添加的后一个结点的地址

}

if(p0->num<=p1->num && p1->Pnext!=NULL)

{

if(p1 == head) // 添加结点到第一个位置

{

p0->Pnext = p1;

head = p0;

}

else

{

p2->Pnext = p0;

p0->Pnext = p1;

}

}

else // 添加结点到最后一个位置

{

p1->Pnext = p0;

p0->Pnext = NULL;

}

n = n+1; // 结点数目 + 1

return(head);

}

/

Author/data: /2009/09/16

Description: 链表的重新排序===按照num(不能重复)的大小从小到大排

列链表数据

参数: head 接收链表第一个节点的地址指针

返回值为新生成链表的第一个节点的地址指针

/

struct student linkpaix(struct student head)

{

struct student stemp,ltemp,shead,head_h; / /

struct student p,q; / 申请两个链表指针,用来储存链表交换过

程的中间值 /

head_h = head;

ltemp = head;

p = (struct student ) malloc(LEN);

q = (struct student ) malloc(LEN); / 为p,q开辟动态存储空间 /

/ -==== 先将链表的第一个数据与其他数据比较 ====- /

while(head->Pnext != NULL)

{

shead = head;

head = head->Pnext;

if(ltemp->num > head->num)

{

if(ltemp == shead)

{

ltemp ->Pnext = head ->Pnext;

head ->Pnext = ltemp;

}

else

{

p->Pnext = head ->Pnext;

q->Pnext = ltemp ->Pnext;

head ->Pnext = q->Pnext;

shead ->Pnext = ltemp;

ltemp ->Pnext = p->Pnext;

}

head_h = head;

head = ltemp;

ltemp = head_h;

}

}

/ -==== 先将链表的第一个数据与其他数据比较 ====- /

/ -==== 比较链表第一个以外的数据 ====- /

while(ltemp ->Pnext != NULL)

{

stemp = ltemp;

ltemp = ltemp ->Pnext;

head = ltemp;

while(head->Pnext != NULL)

{

shead = head;

head = head->Pnext;

if(ltemp->num > head->num)

{

if(ltemp == shead)

{

p->Pnext = head ->Pnext;

stemp ->Pnext = head;

head ->Pnext = ltemp;

ltemp ->Pnext = p->Pnext;

}

else

{

p->Pnext = head ->Pnext;

q->Pnext = ltemp ->Pnext;

stemp ->Pnext = head;

head ->Pnext = q->Pnext;

shead ->Pnext = ltemp;

ltemp ->Pnext = p->Pnext;

}

head = ltemp;

ltemp = stemp ->Pnext;

}

}

}

/ -==== 比较链表第一个以外的数据 ====- /

free(p);

free(q); // 释放p,q的动态存储空间

return(head_h);

}

/

Author/data: /2009/09/15

Description: 主函数

参数:

/

void main()

{

struct student phead,pins; // 定义2个链表指针

int delnum, selflog,flog_a = 1,Nf = 1; // 要删除的对象id

char delflog ; // 删除标志y/n

char insflog, flog_nx = 'n';

char flog_free ; // 释放标志

/ === 输入N个数据 === N 为定值

printf("please input %d numbers:\n",N);

phead = pa(N); // 创建一个动态链表,并赋值

print(phead); // 输出链表数据

/

/ === 输入Nx个数据 === Nx 为输入值 === /

int Nx; // Nx 想要输入的链表长度

printf("How long do you want establish \t");

fflush(stdin);

scanf("%d",&Nx);

/ -== 判断创建的是否是一个空链表 ==- /

while(Nx == 0)

{

printf("您要创建的是一个空链表,是否确定?y/n \t");

fflush(stdin);

scanf("%c",&flog_nx);

if(flog_nx == 'n')

{

printf("How long do you want input\t");

fflush(stdin);

scanf("%d",&Nx);

}

else if(flog_nx == 'y') goto endl;

else

{

printf("wrong input!\n");

printf("How long do you want input\t");

fflush(stdin);

scanf("%d",&Nx);

}

}

printf("please input %d numbers: ",Nx);

printf("如:1,3 两个数中间以,隔开\n");

phead = pa(Nx); // 创建一个动态链表,并赋值

print(phead); // 输出链表数据

/ -== 链表 *** 作 ==- /

while(flog_a)

{

if(phead == NULL) {printf("链表已空,无法 *** 作\n"); flog_a = 0; break;}

printf("\n *** 作\n1:\t插入数据\n2:\t删除数据\n3:\t排序\n4:\t清屏\n5:\t输出现在的链表数据\n0:\texit\n");

printf("\nPlease input:\t");

fflush(stdin);

if(scanf("%d",&selflog)) // select flog 选择项

switch(selflog)

{

case 1 :

/ ====== 插入数据到链表 ====== /

printf("insert someone y/n\t");

fflush(stdin);

scanf("%c",&insflog);

while(insflog != 'n')

{

while(insflog != 'y'&& insflog != 'n')

{

printf("wrnong input,please input again \n");

printf("another one y/n\t");

fflush(stdin);

scanf("%c",&insflog);

}

printf("please input the date:\n");

pins = (struct student )malloc(LEN);

fflush(stdin);

scanf("%d,%f",&pins->num,&pins->cj);

phead = insert(phead,pins);

print(phead);

printf("another one y/n\t");

fflush(stdin);

scanf("%c",&insflog);

while(insflog != 'y'&& insflog != 'n')

{

printf("wrnong input,please input again \n");

printf("another one y/n\t");

fflush(stdin);

scanf("%c",&insflog);

}

}

/ ====== 插入数据到链表 ====== /

break;

case 2 :

/ ====== 删除链表中的数据 ====== /

printf("del someone y/n\t");

fflush(stdin);

scanf("%c",&delflog);

while(delflog != 'n' && phead != NULL)

{

while(delflog != 'y'&& delflog != 'n')

{

printf("wrnong input,please input again \n");

printf("del someone y/n\t");

fflush(stdin);

scanf("%c",&delflog);

}

printf("please input the student what you want del:\n");

fflush(stdin);

scanf("%d",&delnum);

phead = del(phead,delnum);

print(phead);

printf("another one y/n\t");

fflush(stdin);

scanf("%c",&delflog);

if((n+1)==0)

{

printf("There is no more num could be del!\n");

break;

}

}

/ ====== 删除链表中的数据 ====== /

break;

case 3 :

/ ====== 排列链表数据 ====== /

printf("\n排序之后:");

phead = linkpaix(phead);

print(phead); // 排序该数据链表

/ ====== 排列链表数据 ====== /

break;

case 4 :// clrscr();

system("cls");

break;

case 5 : print(phead); break;

case 0 : flog_a = 0 ; break; / 退出 /

default : printf("wrong input\nPlease input again");

break;

}

else printf("非法输入!\n");

}

endl: while(1)

{

if(Nx == 0)

{

printf("Can't establish the link!\n");

break;

}

printf("\n保留数据?y/n\t"); // 是否释放地址空间

fflush(stdin);

scanf("%c",&flog_free);

if(flog_free == 'y')

{

break;

}

else if(flog_free == 'n')

{

freelinkspace(phead);

break;

}

else

{

printf("wrong input!\n");

}

}

printf("OVER!\nGOOD LUCK!\n");

}

字段说明:

用户的id 假设是 uid

要修改的内容是 content

sql语句:

update 表名 set content='修改后的内容' where uid='你传过来的用户id';

但这样的话,表的设计肯定是有问题的。

一般一个用户可以对应多个内容,所以这样的话就会修改该用户的多个内容,应该还需要一个内容的唯一 id,一般会有一个 id 字段,主键自增。

这样修改的时候的 where 条件应该至少有两个:id 和 uid

id 是为了保证只修改到一条内容,且是指定的内容;

uid 是为了保证该内容是同一个创作的(当然前端直接传 uid 是不安全的,应该通过 session 和 token 后端再转成用户的 uid)

VB使用ADO数据库可以分为有源数据库和无源数据库,即是否使用了DSN数据源,如下例:

1、在连接数据库前首先要在VB菜单中“工程”-“引用”从中选择 microsoft activeX Data objects 26 library和 microsoft activeX Data objects recordset 26两个组件,这是在连接数据前所必做的工作。

2、接下来定义ADO的连接对象,如下所示:

Set conn = New ADODBConnection

Set rs = New ADODBRecordset

第一种方法采用的是无源的数据库连接方法

connConnectionString = "Driver={sql server};server=JSZX3-11;uid=sa;pwd=;database=wzc"

connConnectionTimeout = 30

connOpen

rsOpen "select 用户名,密码 from login where 用户名='" & Trim(Combo1Text) & "' And 密码='" & Trim(Text1Text) & "'", conn, adOpenStatic, adLockReadOnly, adCmdText

If rsEOF = True And rsBOF Then

m = MsgBox("请重新登录", vbExclamation)

Text1Text = ""

Text1SetFocus

Else

Form1Hide

End If

rsClose

这是第二种方法连接数据库的方法,这一种方法是采用有源的方法与数据库连接的方法,代码如下所示:

Set conn = New ADODBConnection

Set rs = New ADODBRecordset

connConnectionString = "DSN=login;uid=sa;pwd=;"

connConnectionTimeout = 30

connOpen

rsOpen "select 用户名 from login", conn, adOpenStatic, adLockReadOnly, adCmdText

Dim i As String

For t = 0 To Val(rsRecordCount) - 1

i = Trim(rsFields("用户名")Value)

rsMoveNext

Combo1AddItem i

Next t

rsClose

增删查改的语句按照自己的需要填进去~

// 定义接口 public interface SyUsersService {

/新增用户/

public void addSyUser(SyUsers syUsers);

/根据用户名得到用的注册信息/

public SyLeaguer isRightPasswordProtect(SyLeaguer syLeaguer);

/更新用户的密码/

public void updateSyUserPassword(SyUsers syUsers);

/用户登录验证/

public boolean checkSyUserLogin(SyUsers syUsers);

/

更新用户状态 @param loginName 登录名 @param state 状态号 0/1

@return 是否更新成功 true/flase

/

public boolean updateSyUserState(String loginName,Integer state);

/

分页查询用户信息

@param pageNo 页号

@param pageSize 页面大小

@param hqlQueryRule 查询规则

@return Page 分页查询对象

/

public Page querySyUserPage(int pageNo,int pageSize,HqlQueryRule hqlQueryRule);

/

更新用户密码

@param loginName 登录名 @param oldPassword 旧的密码

@param newPassword 新的密码

/

public void updateSyUserPassword(String loginName,String oldPassword,String newPassword);

/

根据查询规则查询用户

@see HqlQueryRule

@param hqlQueryRule 查询规则

@return 结果集列表 /

public List querySyUser(HqlQueryRule hqlQueryRule);

/

根据登录名获取用户信息 @param loginName

@return

/

public SyUsers getSyUserByLoginName(String loginName);

/

根据登录名获取用户信息

@param loginName

@return

/

public boolean isRepeatUser(String loginName);

/

更新用户

@param loginName

@return

/

public void updateSyUsers(SyUsers syUsers);

}

// 实现接口 public class SyUsersServiceImp extends

orgspringframeworkormhibernate3supportHibernateDaoSupport

implements SyUsersService {

protected static final Log logger = LogFactorygetLog(SyUsersServiceImpclass); public SyUsersServiceImp() {}

/用户注册添加用户/

public void addSyUser(SyUsers syUsers) {

thisgetHibernateTemplate()save(syUsers);

Set babySet=syUsersgetSyLeaguer()getSyLeaguerBabies();

if(babySet!=null&&babySetsize()>0){

SyLeaguerBaby baby=(SyLeaguerBaby)babySetiterator()next();

thisgetHibernateTemplate()save(baby);

}

}

/用户登录/

public boolean checkSyUserLogin(SyUsers syUsers){

String querySQL = "FROM SyUsers WHERE loginName=:username and loginPassword=:password and state=:state and isEmp=:isemp";

Query query = thisgetSession()createQuery(querySQL);

querysetString("username", syUsersgetLoginName());

querysetString("password", syUsersgetLoginPassword());

querysetInteger("state", 1);

querysetInteger("isemp", 0);

List list = (List)querylist();

return listsize()>0true:false;

}

/密码找回得到注册密保信息/

public SyLeaguer isRightPasswordProtect(SyLeaguer syLeaguer){

String querySQL = "FROM SyLeaguer WHERE loginName=:loginname";

Query query = thisgetSession()createQuery(querySQL);

querysetString("loginname", syLeaguergetLoginName());

return (SyLeaguer)queryuniqueResult();

}

public void updateSyUserPassword(String loginName,String newPassword){

} public Page querySyUserPage(int pageNo, int pageSize,

HqlQueryRule hqlQueryRule) {

// TODO Auto-generated method stub

// Criteria c=thisgetSession()createCriteria(SyUsersclass);

// for(int i=0;restrictList!=null&&i<restrictListsize();i++){

// c=cadd((Criterion) restrictListget(i));

// }

// for(int i=0;orderList!=null&&i<orderListsize();i++){

// c=caddOrder((Order) orderListget(i));

// }

// csetFirstResult((int)pagegetStart());

// csetMaxResults(pagegetPageSize());

// List resultList=clist();

//HqlQueryRule hqr=new HqlQueryRule();

//hqraddEqual("id", new Integer(1234));

Page p = new Page();

Page page = null;

String queryPageHQL = "select new map( suloginName as loginName, suloginPassword as loginPassword,suisEmp as isEmp) from SY_RES su where 1=1";

String countHQL = "select count() from SyUsers where 1=1 ";// 总记录数

queryPageHQL=queryPageHQL+hqlQueryRulegetHql();

Query query = thisgetSession()createQuery(queryPageHQL);

List list = querylist();

PageTool pt=new PageTool(page);

page=ptgetHQLQueryPage(thisgetSession(), queryPageHQL,countHQL, null);

return page;

} public boolean updateSyUserState(String loginName, Integer state) {

// TODO Auto-generated method stub

return false;

} public List querySyUser(HqlQueryRule hqlQueryRule) {

// TODO Auto-generated method stub

return null;

} public void updateSyUserPassword(String loginName, String oldPassword,

String newPassword) {

// TODO Auto-generated method stub

} public SyUsers getSyUserByLoginName(String loginName) {

return (SyUsers)thisgetSession()get(SyUsersclass, loginName);

}

/用户名是否重复/

public boolean isRepeatUser(String loginName){

String querySQL = "FROM SyUsers WHERE loginName=:username";

Query query = thisgetSession()createQuery(querySQL);

querysetString("username", loginName);

List list = (List)querylist();

return listsize()>0true:false;

}

public void updateSyUserPassword(SyUsers syUsers){

thisgetSession()update(syUsers);

}

public void updateSyUsers(SyUsers syUsers){

thisgetSession()update(syUsers);

}

}

公司的项目的一段

刚看到了你Update的这一段,这段从语法上看是没有问题的

但是从数据库结构来看就有问题了,你下Update SQL 的时候没有加条件,也就是将这个Table里的所有的记录全部Update 为一样的数据,但是你这个表的 “用户编码”应该是个唯一索引,这个字段不允许有两个相同的数据,所以就会报错

解决方法你可以给它加个条件如下:

sqlAdd('update SysUntUser set 用户编码='''+trim(edit1Text)+''',//这句开始报错

用户名称='''+trim(edit2Text)+''',用户密码='''+trim(edit3Text)+''',单位名称

='''+trim(edit3Text)''' where 用户编码=''用户编码''');

1创建项目:visual C# —> ASPNET MVC 4 web应用程序 模板—>web api;

2注册路由:

路由表中的每一个条目都包含一个路由模板。这个Web API默认的路由模版是"api/{controller}/{id}"。在这个模版中,“api”是一个文字式路径片段,而{controller}和{id}则是占位符变量。

当Web API框架接收一个>

先下载ADONET20 Provider for SQLite。下载binaries zip版就可以了。下载完后解压缩,可以在bin目录下找到SystemDataSQLiteDLL。在vs2008中用Add Reference功能把SystemDataSQLiteDLL加到工程里就可以了。运行下面代码试试:

string datasource = "e:/tmp/testdb";

SystemDataSQLiteSQLiteConnectionCreateFile(datasource);

//连接数据库

SystemDataSQLiteSQLiteConnection conn = new SystemDataSQLiteSQLiteConnection();

SystemDataSQLiteSQLiteConnectionStringBuilder connstr = new SystemDataSQLiteSQLiteConnectionStringBuilder();

connstrDataSource = datasource;

connstrPassword = "admin";//设置密码,SQLite ADONET实现了数据库密码保护

connConnectionString = connstrToString();

connOpen();

//创建表

SystemDataSQLiteSQLiteCommand cmd = new SystemDataSQLiteSQLiteCommand();

string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";

cmdCommandText = sql;

cmdConnection = conn;

cmdExecuteNonQuery();

//插入数据

sql = "INSERT INTO test VALUES('a','b')";

cmdCommandText = sql;

cmdExecuteNonQuery();

//取出数据

sql = "SELECT FROM test";

cmdCommandText = sql;

SystemDataSQLiteSQLiteDataReader reader = cmdExecuteReader();

StringBuilder sb = new StringBuilder();

while (readerRead())

{

sbAppend("username:")Append(readerGetString(0))Append("\n")

Append("password:")Append(readerGetString(1));

}

MessageBoxShow(sbToString());

以上就是关于c语言 建立一个链表,实现增删改查全部的内容,包括:c语言 建立一个链表,实现增删改查、如何利用后台处理执行数据库的增删改查、兄弟们啊,给我一份vb连接sql数据库实现的增删改查程序呗。别的数据库的也可以 但是要vb的,谢啦等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10099815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存