下面是以前写的一个关于链表的综合 *** 作,你可以看看,应该可以满足你的要求。
/
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的,谢啦等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)