链表的增删改查C语言
⑴ c语言 建立一个链表,实现增删改查
下面是以前写的一个关于链表的综合操作,你可以看看,应该可以满足你的要求。
/********************************************************************
created: 2009/09/15
created: 16:9:2009 17:20
filename: E:\dd\lianbiao\lianbiao.cpp
author:
purpose: 一个win32 的控制台程序
实现单项链表的数据删除、插入、排序等功能
*********************************************************************/
#include <stdio.h>
#include "windows.h"
#include "malloc.h"
#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 %5.1f\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;
Ltemp.Pnext = head->Pnext; // Ltemp 用来存放->next,避免空间被
// 释放后,找不到下一个结点的地址
while(head->Pnext != NULL) // 判断是否已经空间释放到最后一个
{
free(head);
head = Ltemp.Pnext;
Ltemp.Pnext = 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");
}
⑵ 数据结构c语言单链表的增删改查程序:#include <stdio.h>
没有main函数在你歼漏程氏岁烂序的最后加上雀做
voidmain()
{
creates();
}
⑶ c 语言对链表中文件的操作,实现增删查改,增删查改后都要存入文件,如何破
1、删除文件部分内容的大概步骤:新敬哗衫建一个临时文件,把原文件内容向临时文件里拷贝,遇到要删除的内容就跳过。结束后关闭文件,用remove("原文件名");把原文件删除,用rename("临时文件名","原文件名");把临时文件名改为原文件名。
2、例如在原文件123.txt中删除以2和以4编号开头的行,可用以下代码实现:
#include "stdio.h"
#include "stdlib.h"芦凯
int main(void){
FILE *fin,*ftp;
char a[1000];
fin=fopen("123.txt","r");//读打开原文亮腔件123.txt
ftp=fopen("tmp.txt","w");//写打开临时文件tmp.txt
if(fin==NULL || ftp==NULL){
printf("Open the file failure...\n");
exit(0);
}
while(fgets(a,1000,fin))//从原文件读取一行
if(a[0]!='2' && a[0]!='4')//检验是要删除的行吗?
fputs(a,ftp);//不是则将这一行写入临时文件tmp.txt
fclose(fin);
fclose(ftp);
remove("123.txt");//删除原文件
rename("tmp.txt","123.txt");//将临时文件名改为原文件名
return 0;
}
⑷ C语言中怎样用链表实现增删改查
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int nDate;
struct node *pstnext;
}Node;
//链表输出
void output(Node *head)
{
Node *p = head->pstnext;
while(NULL != p)
{
printf("%d ", p->nDate);
p = p->pstnext;
}
printf("\r\n");
}
//链表建立
Node* creat()
{
Node *head = NULL, *p = NULL, *s = NULL;
int Date = 0, cycle = 1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
printf("分配内存失败\r\神迅n");
return NULL;
}
head->pstnext = NULL;
p = head;
while(cycle)
{
printf("请输入数据且当输入数据为0时结束输入\r\n");
scanf("%d", &Date);
if(0 != Date)
{
s = (Node*)malloc(sizeof(Node));
if(NULL == s)
{
printf("分配内存失败\r\n");
return NULL;
}
s->nDate = Date;
p->pstnext = s;
p = s;
}
else
{
cycle = 0;
}
}
p->pstnext = NULL;
return(head);
}
//链表按值查找
void research_Date(Node *head, int date)
{
Node *p;
int n=1;
p = head->pstnext;
while(NULL != p && date != p->nDate)
{
p = p->pstnext;
++n;
}
if(NULL == p)
{
printf("链表中没有找到该值");
}else if(date == p->nDate)
{
printf("要查找的值%d在链表中第%d个位置\r\n", date, n);
}
return;
}
//按序号查找
void research_Number(Node *head, int Num)
{
Node *p=head;
int i = 0;
while(NULL != p && i < Num)
{
p = p->pstnext;
i++;
}
if(p == NULL)
{
printf("查找位置不合法\r\n");
}else if(i == 0)
{
printf("查找位置为头结点\r\n");
}else if(i == Num)
{
printf("第%d个位置数据为%d\r\n", i, p->nDate);
}
}
//在指定元素之前插入新结点
void insert_1(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre && j < i-1)
{
pre = pre->pstnext;
j++;
}
if(NULL == pre || j > i-1)
{
printf("插入位置不存在\谨游r\n");
}else
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}
}
//在指定元素之后插入祥瞎销新结点
void insert_2(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre->pstnext && j < i)
{
pre = pre->pstnext;
j++;
}
if(j == i)
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}else
{
printf("插入位置不存在\r\n");
}
}
//删除指定结点
void Delete_1(Node *head, int i3)
{
Node *p = head, *pre = NULL;
int j = 0;
while(NULL != p && j < i3)
{
pre = p;
p = p->pstnext;
j++;
}
if(NULL == p)
{
printf("删除位置不存在\r\n");
}else
{
pre->pstnext = p->pstnext;
free(p);
}
}
void main()
{
int date, num; //待查找数据
int i3; //指定删除元素的位置
int i1, i2, Newdate_1, Newdate_2; //待插入的新数据
Node *Head = NULL; //定义头结点
Node *Head_New = NULL;
//链表建立
Head = creat();
printf("输出建立的单链表\r\n");
output(Head);
//链表按值查找
printf("请输入待查找的数据\r\n");
scanf("%d", &date);
research_Date(Head, date);
//链表按序号查找
printf("请输入待查找序号\r\n");
scanf("%d", &num);
research_Number(Head, num);
//在指定第i1个元素之前插入新元素Newdate
printf("在指定第i个元素之前插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i1, &Newdate_1);
insert_1(Head, i1, Newdate_1);
printf("插入后新链表\r\n");
output(Head);
//在指定第i2个元素之后插入新元素Newdate
printf("在指定第i个元素之后插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i2, &Newdate_2);
insert_2(Head, i2, Newdate_2);
printf("插入后新链表\r\n");
output(Head);
//指定删除i3元素
printf("删除元素的位置\r\n");
scanf("%d", &i3);
Delete_1(Head, i3);
printf("删除后新链表\r\n");
output(Head);
return;
}
⑸ 如何用C语言做到增删改查 内详
很早前帮朋友写的,跟你的需求很像,给你用吧。
你可改下main函数,使它更贴近你的需求。
如果你不会改,再帮你改吧。
-------------------------------------------
#include <time.h>
#include <stdio.h>
#define NULL -2
#define ERROR -1
#define OK 1
#define TRUE 2
#define FALSE 3
#define Boolen int
#define Status int
#define LIST_INIT_SIZE 3
#define LIST_INCREMENT 2
#define NAME_LEN 13
#define DES_LEN 30
char ErrDescription[DES_LEN];
typedef struct{
int NO;
char Name[NAME_LEN];
enum{male,female} Sex;
int Age;
char Tel[15];
char Inserttime[64];
}ElemType,*ElemPointer;
typedef struct{
ElemPointer base; //基址
int length; //表长
int listsize; //内存占用
int elemcount; //记录数
}SqList,*SqPointer;
int ErrorEXP(int i)
{
switch(i)
{ case 1: strcpy(ErrDescription,"InitList::(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) 空间申请失败");break;
case 2: strcpy(ErrDescription,"IncreaseList::(ElemType *)realloc(L->base,(L->length + LIST_INCREMENT) * sizeof(ElemType)) 空间申请失败");break;
case 3: strcpy(ErrDescription,"if(!L->base) return Error; SqList不存在");break;
case 4: strcpy(ErrDescription,"GetElem:: i 越界");break;
case 5: strcpy(ErrDescription,"ListInsert:: i 越界");break;
case 6: strcpy(ErrDescription,"ListInsert:: CALL IncreaseList(L)==ERROR return Error 邻接空间申请失败,由ListInsert返回");break;
case 7: strcpy(ErrDescription,"ListDelete:: i 越界");break;
case 8: strcpy(ErrDescription,"KeyInList:: i 越界");break;
case 9: strcpy(ErrDescription,"KeyInList:: CALL ListInsert(L,i,temp)==ERROR return Error 邻接空间申请失败,由KeyInList返回");break;
case 10: strcpy(ErrDescription,"ScanfList:: CALL KeyInList(L,i++)==ERROR return Error");break;
}
puts("!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!\n");
puts(ErrDescription);
puts("\n!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!\n");
return ERROR;
}
Status InitList(SqPointer L)
{
L->base = 0; //不可不要!!! 去掉后即使(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType))失败,系统也会认为正常
L->base = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->base) return ErrorEXP(1); //空间申请失败,返回
L->length = LIST_INIT_SIZE;
L->listsize = L->length * sizeof(ElemType);
L->elemcount = 0;
return OK;
}
Status IncreaseList(SqPointer L)
{
ElemPointer newbase;
newbase = (ElemType *)realloc(L->base,(L->length + LIST_INCREMENT) * sizeof(ElemType));
if(!newbase) return ErrorEXP(2);
L->base = newbase;
L->length += LIST_INCREMENT;
L->listsize = L->length * sizeof(ElemType);
return OK;
}
Status DestroyList(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
free(L->base);
L->length = NULL;
L->listsize = NULL;
L->elemcount = NULL;
return OK;
}
Status ClearList(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
L->elemcount = 0;
return OK;
}
Boolen ListEmpty(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(L->elemcount == 0)
return TRUE;
else
return FALSE;
}
int ListElemCount(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
return L->elemcount;
}
Status GetElem(SqPointer L,int i,ElemType *ret) //调用此函数需将ret指向main函数域某一ElemType变量
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i > L->elemcount) return ErrorEXP(4); //i越界,返回
*ret = L->base[i-1]; //i 从1开始 此种方法在main中改变*ret会直接更改链表中数据
return OK;
}
//重大发现 指针型 temp->base 普通型L.base
int LocateElem(SqPointer L,char Locatename[]) //返回的i从1开始
{
int i=0;
ElemType *temp;
if(!L->base) return ErrorEXP(3); //L不存在,返回
while(i<L->elemcount)
{
temp=&(L->base[i]); //改为temp=L->base[i++];并去除下面的i++; ??
if(strcmp(temp->Name,Locatename) == 0) return i+1; //不能用temp->Name==locatename来试图比较字符串
i++;
}
return 0;
}
Status ListInsert(SqPointer L,int i,ElemType newelem) //插入位置1<=i<=elemcount+1
{
ElemPointer newbase;
ElemType *temp,*flag;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount + 1) return ErrorEXP(5);
if(L->elemcount == L->length)
if(IncreaseList(L)==ERROR) return ErrorEXP(6);
flag=&(L->base[i-1]); //插入位置
for(temp=&(L->base[L->elemcount-1]);temp>=flag;temp--)
*(temp+1)=*temp;
*flag=newelem;
L->elemcount++;
return OK;
}
Status ListDelete(SqPointer L,int i,ElemType *ret) //调用此函数需将ret指向main函数域某一ElemType变量
{
ElemType *temp;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount) return ErrorEXP(7);
*ret=L->base[i-1]; //删除位置,这里先返回该值
for(temp=&(L->base[i]);temp<=&(L->base[L->elemcount-1]);temp++)
*(temp-1)=*temp;
L->elemcount--;
return OK;
}
Status KeyInList(SqPointer L,int i)
{
ElemType temp;
time_t t;
char tmp[64];
char S;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount + 1) return ErrorEXP(8);
printf("正在输入第%d个元素的值:",i);
printf("\n编号:(int)\n");
scanf("%d",&temp.NO);
printf("\n姓名:(char *)\n");
scanf("%s",&temp.Name);
printf("\n性别:(m or f)\n");
do{
S=getch();
if(S=='m')
temp.Sex=male;
else if(S=='f')
temp.Sex=female;
else
puts("Key in 'm' or 'f'.\n");
}while(S!='m' && S!='f');
putchar(S);
printf("\n年龄:(int)\n");
scanf("%d",&temp.Age);
printf("\n电话:(char *)\n");
scanf("%s",&temp.Tel);
printf("\n记录时间:\n");
t=time(0);
strftime(tmp,sizeof(tmp),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t));
puts(tmp);
strcpy(temp.Inserttime,tmp);
if(ListInsert(L,i,temp)==OK)
return OK;
else
return ErrorEXP(9);
}
ElemType ScanfElem()
{
ElemType temp;
time_t t;
char tmp[64];
char S;
printf("正在录入元素:");
printf("\n编号:(int)\n");
scanf("%d",&temp.NO);
printf("\n姓名:(char *)\n");
scanf("%s",&temp.Name);
printf("\n性别:(m or f)\n");
do{
S=getch();
if(S=='m')
temp.Sex=male;
else if(S=='f')
temp.Sex=female;
else
puts("Key in 'm' or 'f'.\n");
}while(S!='m' && S!='f');
putchar(S);
printf("\n年龄:(int)\n");
scanf("%d",&temp.Age);
printf("\n电话:(char *)\n");
scanf("%s",&temp.Tel);
printf("\n记录时间:\n");
t=time(0);
strftime(tmp,sizeof(tmp),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t));
puts(tmp);
strcpy(temp.Inserttime,tmp);
return temp;
}
Status ScanfList(SqPointer L,int i)
{
char p='c';
while(putchar('\n'),p=='c'||p=='C')
{ p='\0';
if(KeyInList(L,i++)==ERROR) return ErrorEXP(10);
printf("\nPress ESC key to exit or 'C' to continue...");
while(p!='c' && p!='C' && (int)p!=27)
p=getch();
}
return OK;
}
Status PrintListProperty(SqPointer L)
{
puts("SqList L Property:");
if(!L->base)
{ puts("链表不存在!");
return OK;}
else
puts("链表已初始化...\n");
printf("%d/%d BASE=%d,MemoryStatus=%d\n",L->elemcount,L->length,L->base,L->listsize);
return OK;
}
Status PrintOnScreen(SqPointer L)
{
int i;
char Stmp[7],t;
if(!L->base) return ErrorEXP(3); //L不存在,返回
puts("Push 'C' shell CLS or other key to skip.");
t=getch();
if(t=='c' || t=='C')
system("cls");
puts("数据表打印:");
for(i=0;i<=L->elemcount-1;i++)
{ printf("\nElem %d st:\n",i+1);
if(L->base[i].Sex == male)
strcpy(Stmp,"male");
else if(L->base[i].Sex == female)
strcpy(Stmp,"female");
else
strcpy(Stmp,"Unknow");
printf("NO:%d\tName:%s\t\tSex:%s\tAge:%d\n\tTel:%s\n\tInsertTime:%s\n",L->base[i].NO,L->base[i].Name,Stmp,L->base[i].Age,L->base[i].Tel,L->base[i].Inserttime);
}
return OK;
}
Status PrintElem(ElemPointer elem)
{
char Stmp[7];
printf("\nPrintElem:\n");
if(elem->Sex == male)
strcpy(Stmp,"male");
else if(elem->Sex == female)
strcpy(Stmp,"female");
else
strcpy(Stmp,"Unknow");
printf("NO:%d\tName:%s\t\tSex:%s\tAge:%d\n\tTel:%s\n\tInsertTime:%s\n",elem->NO,elem->Name,Stmp,elem->Age,elem->Tel,elem->Inserttime);
return OK;
}
void main() //把以上所有函数都串了起来
{
SqList TheList;
SqPointer ListP;
ElemType mylistelem,*elemtemp;
ElemPointer mylist;
int i;
char nameT[20];
elemtemp=&mylistelem; //*ret
ListP=&TheList;
if(InitList(ListP)==OK) puts("InitList(TheList)==OK");
PrintListProperty(ListP);
if(ListEmpty(ListP)==TRUE) puts("ListEmpty==True");
else puts("ListEmpty==False");
ScanfList(ListP,1);
PrintListProperty(ListP);
PrintOnScreen(ListP);
printf("ListElemCount return %d.",ListElemCount(ListP));
puts("\nGetElem index? ");
scanf("%d",&i);
if(GetElem(ListP,i,elemtemp)==OK) PrintElem(elemtemp);
puts("\nLocateElem name? ");
scanf("%s",nameT);
printf("LocateElem return %d.",LocateElem(ListP,nameT));
puts("\nListDelete index? ");
scanf("%d",&i);
if(ListDelete(ListP,i,elemtemp)==OK) PrintElem(elemtemp);
puts("\nListInsert index? ");
scanf("%d",&i);
puts("\nListInsert NEWELEM? ");
ListInsert(ListP,i,ScanfElem());
PrintListProperty(ListP);
PrintOnScreen(ListP);
if(ClearList(ListP)==OK) puts("ClearList==OK");
if(ListEmpty(ListP)==TRUE) puts("ListEmpty==True");
if(DestroyList(ListP)==OK) puts("DestroyList==OK");
getch();
}
/* 函数列表
类型 名称 参数 说明
int ErrorEXP (int i) 错误描述符
Status InitList (SqPointer L) 初始化SqPointer L... 通过L返回base
Status IncreaseList (SqPointer L) L当前满时,继续申请空间
Status DestroyList (SqPointer L) 销毁L
Status ClearList (SqPointer L) 把L置为空表
Boolen ListEmpty (SqPointer L) 判断L是否为空表,是则返回TRUE
int ListElemCount (SqPointer L) 返回当前L中记录的元素个数
Status GetElem (SqPointer L,int i,ElemType *ret) 通过*ret返回i号元素
int LocateElem (SqPointer L,char Locatename[]) 顺序查找表,根据name字段,返回首个匹配元素的i,无则返回0
Status ListInsert (SqPointer L,int i,ElemType newelem) 在L中的i号位置插入newelem元素
Status ListDelete (SqPointer L,int i,ElemType *ret) 删除L中第i号元素,并用*ret返回该元素
Status KeyInList (SqPointer L,int i) 从键盘输入单个元素并插入到i号位置
ElemType ScanfElem () 从键盘输入单个元素返回一个ElemType类型的节点
Status ScanfList (SqPointer L,int i) 从i号开始递增顺序录入元素到L,直到按'ESC'
Status PrintListProperty(SqPointer L) 打印L的属性,打印格式为(已用空间/已申请空间 基址 内存占用)
Status PrintOnScreen (SqPointer L) 打印整张L表到屏幕
Status PrintElem (ElemPointer elem) 打印单个ElemType类型的元素
时间仓促,所以乱了些,书上2章开头 动态线性的顺序表 的基本操作几乎都写了
不知你说的是不是这个,mian函数比较乱,只是把所有的基本操作都串了起来,你
可以根据情况改改主函数的调用过程,就会比较清楚是怎么实现的了。你可以按F10
进行单部跟踪,F11可以进入调用过程,一步一步跟着程序走一遍就好了。
关于动态链表的我之前写过一个,也好象给你看过,这里再附上一起发过去。文件LinkList.c
只实现了构造链表,并打印出来的功能。
*/