c语言线性表操作
㈠ 数据结构(c语言版)数据类型线性表的实现
常用的线性表的插入,删除,创建,按位置查找,按值查找,排序。其他操作都是基于以上基本操作实现的,你所谓的12个操作:排序有很多方法,插入类,选择类,交换类,归并类,基数排序法等,这些都是线性表的操作。
一般本科阶段教学大纲中掌握上面的内容即可。
㈡ 怎样创建线性表(C语言)
线性表是个抽象的概念,没办法直接创建抽象类型,需要具体的类型(比如数组,链表)。
比如创建数组:int array[100];
创建一个GList链表: GList * list = NULL; (空的)
㈢ 用C语言建立一个顺序存储的线性表并实现线性表的插入和删除操作
链表
1。是由结构体和指针构成的。
2。包括两个部分一个是数据域和指针域。
3。链表中的结点分为两类:头结点和一般结点。头结点是没有数据域的。
4。基本操作有:初始化链表,增加结点和删除结点,求链表的长度等等。
struct Linknode{
int data;
struct Linknode *next;
};
这个地方有个知识点:这个是链表的数据结构是有结构体和指针构成。结构体名为Linknode.但这里面没有定义结构体变量,只有我们定义了结构体变量才能使用结构体。
结构体变量怎么定义呢?
有两种方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我们都希望采用第2种,这样的好处是: 当我们再定义结构体变量时,可以用:Linklist p;而如果我们采用第一种还必须采用 struct Linknode p;对比一下就可以知道第2种要简单很多。那么下面我们都采用第2种方式来定义结构体变量。
上面我们已经定义了一个链表:
1。初始化链表。
#include
#include
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等于L,对与*Lnode的分配空间相当与对主函数中的L分配空间。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化链表的时候,我们用到了2级指针为什么呢?因为我们希望在InitLinkList函数生成的头结点,主函数中也能指向这个头结点。如果我们用一级指针的话,用malloc分配空间的时候,它将会返回分配空间的首地址给指针变量Lnode,而不能使是的空间被主函数中指针变量L得到这个地址。所以我们要用2级指针。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加链表结点
增加链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
 break;
p=Lnode->next;//p指向头结点
//通过while循环和指针变量p定位要插入的结点q的位置。
while(p)
p=p->next;
//生成一个要插入的结点
q=(Linklist)malloc(sizeof(Linklist));//申请要插入的结点空间
q->data=d;//填充要插入结点的数据域
q->next=p->next;//首先填充要插入结点q的指针域进行填充。
p->next=q;//然后把定位好的p指针域进行修改指向q.
 
}while(9);//循环退出的条件是输入的数据-9999
 
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
}
3。求链表的长度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向链表的第一个结点。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入一个结点
LengthLinkList(L)//求链表的长度。
}
4.删除结点
删除链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向链表的头结点
while(p)
{
q=p->next;//q指向当前结点的下一个结点。
free(p);//释放当前结点
p=q;//p指向下一个结点
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
LengthLinkList(L)//求链表的长度。
DestroyLinkList(L);//删除链表结点
}
㈣ 线性表的基本操作c语言实现
代码如下:
头文件:
2_1.h
#ifndef _2_1_H
#define _2_1_H
typedef void SeqList;
typedef void SeqListNode;
//创建线性表
SeqList * SeqList_Create(int capacity);
//销毁线性表
void SeqList_DesTroy(SeqList * list);
void SeqList_Clear(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList* list);
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
SeqListNode* SeqList_Get(SeqList* list, int pos);
SeqListNode* SeqList_Delete(SeqList* list, int pos);
#endif
源文件:
// 顺序线性表.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include "2_1.h"
typedef unsigned int TSeqListNode;
typedef struct {
int len; //长度
int capacity;//总长度
TSeqListNode * node;//每个节点的指针
} TSeqList;
int main()
{
SeqList* list = SeqList_Create(5);//创建线性表
int i = 6;//赋值6个变量,已超过线性表最大值 5
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;
int index = 0;
SeqList_Insert(list, &i, 7); //将这6个变量插入线性表中
SeqList_Insert(list, &j, 0);
SeqList_Insert(list, &k, 0);
SeqList_Insert(list, &x, 0);
SeqList_Insert(list, &y, 0);
SeqList_Insert(list, &z, 0);
//遍历
for(index=0; index<SeqList_Length(list); index++)
{
int* p = (int*)SeqList_Get(list, index);
printf("%d ", *p);
}
printf(" ");
//删除操作
while( SeqList_Length(list) > 0 )
{
int* p = (int*)SeqList_Delete(list, 0);
printf("删除了: %d ", *p);
}
SeqList_Clear(list);
SeqList_DesTroy(list);
system("pause");
return 0;
}
//创建线性表
SeqList * SeqList_Create(int capacity)
{
TSeqList* ret = NULL ;
if(capacity >= 0)
{
ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity); //为线性表分配空间,包含结 //构体和节点的总大小
}
if(NULL != ret)
{
ret->len = 0;
ret->capacity = capacity;
ret->node = (TSeqListNode*)(ret + 1);//将节点指向上述分配到的空间的后部分
}
return ret;
}
//销毁
void SeqList_DesTroy(SeqList * list)
{
free(list);
}
//清空
void SeqList_Clear(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
if(NULL != ret)
{
ret->len = 0;
}
}
//获得线性表的长度
int SeqList_Length(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
int len = -1;
if(NULL != ret)
{
len = ret->len;
}
return len;
}
//线性表的总长度
int SeqList_Capacity(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
int capacity = -1;
if(NULL != ret)
{
ret->capacity = capacity;
}
return capacity;
}
//插入
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
TSeqList * sList = (TSeqList*)list;
int i,ret = -1;
if((sList != NULL) &&(pos >= 0) && sList->capacity >= sList->len+1)
{
if(pos >= sList->len)
{
pos = sList->len;
}
for(i = sList->len; i > pos; i--)
{
sList->node[i] = sList->node[i-1];
}
sList->node[i] = (TSeqListNode)node;
++sList->len;
ret = 1;
}
return ret;
}
//获得指定位置的节点
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
TSeqList * sList = (TSeqList*)list;
TSeqListNode* node = NULL;
if(NULL != sList && pos>=0 && pos < sList->len)
{
node = (TSeqListNode*)sList->node[pos];
}
return node;
}
//删除
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
TSeqList * sList = (TSeqList*)list;
SeqListNode * node = SeqList_Get( list, pos);
int i;
if(sList != NULL && pos >= 0 && pos< sList->len)
{
for( i=pos+1; i<sList->len; i++)
{
sList->node[i-1] = sList->node[i];
}
sList->len--;
}
return node;
}
演示:

资料拓展:
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。
线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
㈤ C语言——线性表
#include"stdio.h"
#include<malloc.h>
typedef char ElemType;
typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;
void CreatListF(LinkList *&L,ElemType a[],int n)  //头插法建表
{
 LinkList *s;int i;
 L=(LinkList *)malloc(sizeof(LinkList));
 L->next=NULL;
 for(i=0;i<n;i++)
 {
  s=(LinkList *)malloc(sizeof(LinkList));
  s->data=a[i];
  s->next=L->next;
  L->next=s;
 }
}
void CreateListR(LinkList *&L,ElemType a[],int n)   //尾插法建表
{
 LinkList *s,*r;int i;
 L=(LinkList *)malloc(sizeof(LinkList));
 r=L;
 for(i=0;i<n;i++)
 {
  s=(LinkList *)malloc(sizeof(LinkList));
  s->data=a[i];
  r->next=s;
  r=s;
 }
 r->next=NULL;
}
void InitList(LinkList *&L)    //初始化线性表
{
 L=(LinkList *)malloc(sizeof(LinkList));
 L->next=NULL;
}
void DestroyList(LinkList *&L)     //销毁线性表
{
 LinkList *p=L,*q=p->next;
 while(q!=NULL)
 {
  free(p);
  p=q;
  q=p->next;
 }
 free(p);
}
int ListEmpty(LinkList *L)    //判断线性表是否为空
{
 return(L->next==NULL);
}
int ListLength(LinkList *L)    //求线性表的长度
{
 LinkList *p=L;int n=0;
 while(p->next!=NULL)
 {
  n++;p=p->next;
 }
 return(n);
}
void DispList(LinkList *L)   //输出线性表
{
 LinkList *p=L->next;
 while(p!=NULL)
 {
  printf("%c",p->data);
  p=p->next;
 }
}
int GetElem(LinkList *L,int i,ElemType &e)   //求线性表中某个数据元素值
{
 int j=0;
 LinkList *p=L;
 while(j<i&&p!=NULL)
 {
  j++;p=p->next;
 }
 if(p==NULL)
  return 0;
 else
 {
  e=p->data;return 1;
 }
}
int LocateElem(LinkList *L,ElemType e)    //按元素值查找
{
 LinkList *p=L->next;
 int i=1;
 while(p!=NULL&&p->data!=e)
 {
  p=p->next;i++;
 }
 if(p==NULL)return(0);
 else return(i);
}
int ListInsert(LinkList *&L,int i,ElemType e)   //插入数据元素
{
 int j=0;
 LinkList *p=L,*s;
 while(j<i-1&&p!=NULL)
 {
  j++;p=p->next;
 }
 if(p==NULL)return 0;
 else
 {
  s=(LinkList *)malloc(sizeof(LinkList));
  s->data=e; s->next=p->next; p->next=s;
  return 1;
 }
}
int ListDelete(LinkList *&L,int i,ElemType &e)  //删除数据元素
{
 int j=0;
 LinkList *p=L,*q;
 while(j<i-1&&p!=NULL)
 {
  j++;p=p->next;
 }
 if(p==NULL)
  return 0;
 else
 {
  q=p->next;
  if(q==NULL)return 0;
  e=q->data;
  p->next=q->next;
  free(q);
  return 1;
 }
}
int main()
{
 ElemType e,a[5]={'a','b','c','d','e'};
 LinkList *h;
 InitList(h);                                //初始化顺序表h
 CreateListR(h,&a[0],5);                     //依次采用尾插入法插入a,b,c,d,e元素
 printf("单链表为:"); 
 DispList(h);  printf("\n");                 //输出顺序表h
 printf("该单链表的长度为:"); 
 printf("%d",ListLength(h)); printf("\n");   //输出顺序表h的长度
 if(ListEmpty(h)) printf("该单链表为空。\n");   
 else printf("该单链表不为空。\n");          //判断顺序表h是否为空
 GetElem(h,3,e);printf("该单链表的第3个元素为:"); 
 printf("%c",e); printf("\n");               //输出顺序表h的第3个元素
 printf("该单链表中a的位置为:"); 
 printf("%d",LocateElem(h,'a')); printf("\n");  //输出元素'a'的位置
 ListInsert(h,4,'f');                        //在第4个元素位置插入'f'素
 printf("在第4 个元素位置上插入'f'后单链表为:"); 
 DispList(h); printf("\n");               //输出顺序表h
 ListDelete(h,3,e);                           //删除L的第3个元素
 printf("删除第3个元素后单链表为:");
 DispList(h); printf("\n");               //输出顺序表h
 DestroyList(h);                             //释放顺序表h
 return 0;
}
㈥ C语言的线性表问题
简单调了一下,线性表从第1个元素开始存储数据。

#define MAXSIZE 10000
typedef struct {
int data[MAXSIZE];
int last;
} SeqList;
SeqList* init_SeqList()
{
SeqList *L;
L = (SeqList *)malloc(sizeof(SeqList));
if (L)
{
L->last = -1;
return L;
}
else
return 0;
}
void CreateList(SeqList& L)
{
int i;
printf("请输入你想要的顺序表的长度 ");
scanf("%d", &L.last);
printf("请输入一组整型元素,每个元素之间请用空格隔开(不超过20) ");
for (i = 1; i <= L.last; i++)
{
scanf("%d", &L.data[i]);
}
}
void TraverseList(SeqList& L)
{
int i;
printf("展示顺序表中的整形元素 ");
for (i = 1; i <= L.last; i++)
printf("%d ", L.data[i]);
printf(" ");
}
void LocateList(SeqList& L, int x)
{
int i;
int a = -1;
for (i = 1; i <= L.last; i++)
if (L.data[i] == x) {
a = i;
printf("你要查找的元素在第%d位 ", a);
}
if (a == -1) {
printf("false ");
}
}
void InsertList(SeqList& L, int i, int x)
{
int a;
if (L.last == MAXSIZE) {
printf("顺序线性表已经满了");
return;
}
if (i<1 || i>L.last) {
printf("你插入的元素不在范围内");
return;
}
if (i <= L.last)
{
for (a = L.last; a >= i; a--) {
L.data[a + 1] = L.data[a];
}
L.data[i] = x;
L.last++;
}
}
void DeleteList(SeqList& L, int i)
{
int a;
if (L.last == 0) {
printf("false");
return;
}
if (i<1 || i>L.last) {
printf("false");
return;
}
if (i <= L.last)
{
for (a = i; a < L.last; a++)
L.data[a] = L.data[a+1];
}
L.last--;
}
int main() {
SeqList L;
int x, i, choice;
printf("请输入1-5在以下菜单中选择你需要的操作(第一次选择必须选择1) ");
printf("1、建立一个顺序表 ");
printf("2、对该顺序表进行遍历 ");
printf("3、在顺序表中查找某一元素 ");
printf("4、在顺序表i位置中插入元素x ");
printf("5、在顺序表i位置中删除元素x ");
while (1)
{
printf("请选择你需要的操作: ");
scanf("%d", &choice);
switch (choice)
{
case 1:CreateList(L); break;
case 2:TraverseList(L); break;
case 3:printf("请输入你要查找的元素 ");
scanf("%d", &x);
LocateList(L, x); break;
case 4:printf("请输入你要插入的位置i ");
scanf("%d", &i);
printf("请输入你要插入的元素x ");
scanf("%d", &x);
InsertList(L, i, x);
printf("插入成功 "); break;
case 5:printf("请输入你要删除的元素的位置i ");
scanf("%d", &i);
DeleteList(L, i);
printf("删除成功 "); break;
}
}
return 0;
}
㈦ 线性表的操作(C语言)
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define STY "%d"/*元素类型格式符*/
typedef int eltp;/*元素类型*/
typedef struct node{
 eltp data;
 struct node *next;
} node;
void init(void)
{
 static int fg=1;
 if (fg) {
  srand(time(NULL));
  fg=0;
 }
}
node *insert(node *h,eltp d)
{
 node *s=(node *)malloc(sizeof(node));
 if (!h) {
  s->data=d;
  s->next=NULL;
  h=s;
 }
 else {
    h->next=insert(h->next,d);
 }
 return h;
}
node *create(int n)
{
 node *h=NULL;
 int i;
 for (i = 0; i<n; i++) {
  h=insert(h,rand()%100);
 }
 if (h) {
  printf("线性表生成已完成!\n");
 }
 else {
  fprintf(stderr,"线性表生成未成功\n");
  exit(-1);
    }
 return h;
}
node *del(node *h,eltp d)
{
 node *p;
 if (h&&h->data==d) {
  p=h;
  h=h->next;
  free(p);
 }
 else if (h) h->next=del(h->next,d);
 return h;
}
int search(node *h,eltp d)
{
 int i=1;
 while (h&&h->data!=d)
  {
   h=h->next;
   i++;
  }
 if (!h) i=-1;
 return i;
}
int count(node *h)
{
 int i=0;
 for (i = 0; h; i++) {
  h=h->next;
 }
 return i;
}
void prt(node *h)
{
 while (h)
  {
   printf(STY"\t",h->data);
   h=h->next;
  }
 putchar('\n');
}
void Free(node **h)
{
 if (*h) {
  Free(&(*h)->next);
  free(*h);
  *h=NULL;
 }
}
int menu(void)
{
 int i;
 puts("******************");
 puts("1.生成线性表");
 puts("2.输出表元素");
 puts("3.删除表元素");
 puts("4.查找表元素");
 puts("5.统计表元素");
 puts("6.插入表元素");
 puts("7.删除线性表");
 puts("0.退出本程序");
 puts("******************");
 printf("请选择:");
 scanf("%d",&i);
 return i;
}
void find(node *h)
{
 eltp a;
 //node *t=NULL;
 int index;
 printf("请输入要查找的数字:");
 scanf(STY,&a);
 index=search(h,a);
 if (index!=-1) {
  printf(STY"是表中的第%d个元素\n",a,index);
 }
 else printf(STY"不是表中的元素\n",a);
}
node *insert_node(node *h,int index,eltp a)
{
 node *hd=h,*in=(node *)malloc(sizeof(node));
 int i;
 in->data=a;
 if (index>1) {
 for (i=1; h->next&&i<index-1; i++) {
    h=h->next;
 }
 in->next=h->next;
 h->next=in;
 }
 else {
  in->next=hd;
  hd=in;
 }
 return hd;
}
node *remove_node(node *h)
{
 eltp a;
 printf("请输入要删除的元素:");
 scanf(STY,&a);
 h=del(h,a);
 puts("已完成");
 return h;
}
node *ins(node *h)
{
 eltp a;
 int i;
 printf("请输入要插入的元素:");
 scanf(STY,&a);
 printf("请输入要插入的位置:");
 scanf("%d",&i);
 return insert_node(h,i,a);
}
int main(void)
{
 node *head=NULL;
 int ch;
  init();
 do
 {
    ch=menu();
    switch (ch) {
    default:printf("输入有误,重新输入\n");break;
     case 0:break;
     case 1:if(head) Free(&head);
     head=create(10);
     break;
     case 2:prt(head);break;
     case 3:head=remove_node(head);break;
     case 4:find(head);break;
     case 5:printf("表中共有%d个元素\n",count(head));break;
     case 6:head=ins(head);break;
     case 7:Free(&head);break;
    }
 }while (ch);
 Free(&head);
 return 0;
}
//---------------------------------------------------------------------------
㈧ 用C语言实现线性表的顺序存储(创建,插入,删除和查找)
//C++课程设计---学生成绩管理系统
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
typedef struct studentinfo //结构体定义
{
	int num;//学号
	char name[64];//姓名
	int sex;//性别,1为男性,0为女性
	float math;//数学
	float english;//英语
	float politic;//政治
	float chinese;//语文
	float total;//总成绩
	struct studentinfo *next;
}STUDENT;
#define FILENAME "D:\\1.txt"
//定义默认的数据库文件
#define DELAYTIME 1500
//显示信息,延时
void create_menu();
STUDENT * new_student();
STUDENT* create_linkbyfile(char *);
STUDENT *del_info(STUDENT *);
int save_info(char *,STUDENT *,int);
int find_infile_printf(char *);
int pri_whole_link(STUDENT *);
STUDENT* printf_sort(STUDENT *);
void free_link(STUDENT *);
void main() //主函数
{
	create_menu();
}
STUDENT * reverse(STUDENT *head)
//功能:链表反转顺序
//参数:head链表头结点指针
{
	STUDENT *ptemp,*p1;
	if(head==NULL)
	{
		return 0;
	}
	p1=head;//p1使之永远指向排好序的第一个结点,初值为head,head使之永远是已经排好序的最后一个结点
	
	while(head->next!=NULL)//本次循环使ptemp排好序
	{
		ptemp=head->next;//ptemp指向未排好序的第一个结点
		head->next=ptemp->next;//
		ptemp->next=p1;//ptemp也排好序了,ptemp变成排好序的第一个结点了
		p1=ptemp;//再次让p1成为第一个排好序的结点
	}
	return p1;//头结点为第一个结点
}
void create_menu()
//功能:输出功能菜单,提供人-机接口
{
	char menu_Num;
	STUDENT *head=NULL;
	char ch;
	char file_name[256];
	while(1)
	{
	system("cls");
	cout<<"\t\t学生成绩管理系统\n";
	cout<<"##########################################\n";
	cout<<"#\t\t 1.新增学生信息\t\t #\n";
	cout<<"#\t\t 2.加载数据库\t\t #\n";
	cout<<"#\t\t 3.删除学生信息\t\t #\n";
	cout<<"#\t\t 4.保存学生信息\t\t #\n";
	cout<<"#\t\t 5.数据库查询\t\t #\n";
	cout<<"#\t\t 6.原序输出\t\t #\n";
	cout<<"#\t\t 7.排序输出\t\t #\n";
	cout<<"#\t\t 8.退出\t\t\t #\n";
	cout<<"##########################################\n";
	cout<<"请输入操作编号:";
	cin>>menu_Num;
	switch (menu_Num)
	{
	case '1':
		free_link(head);//释放链表空间
		head=new_student();//新增学生信息
		break;
	case '2':
		free_link(head);//释放链表空间
		cout<<"请输入要加载的数据库文件的路径"<<endl;
		cin>>file_name;
		head=create_linkbyfile(file_name);//读取数据文件
		if(head!=NULL)
		{
			cout<<"数据库"<<file_name<<"已加载"<<endl;
			Sleep(DELAYTIME);
		}
		break;
	case '3':
		del_info(head);//删除学生信息
		break;
	case '4'://保存学生信息
		if (head==NULL)
		{
			cout<<"请先生成学生信息"<<endl;
			Sleep(DELAYTIME);
		}
		else
		{
			
			cout<<"想将学生信息保存到哪个数据库文件?";
			cin>>file_name;
			cout<<"请选择保存方式:0追加到文件末尾   1覆盖文件\n";
			cin>>menu_Num;
			if(save_info(file_name,head,menu_Num-'0')==0)//0表示追加,1表示覆盖
			{
				cout<<"信息保存失败\n";
			}
			else
			{
			cout<<"数据已保存到"<<file_name<<endl;
			Sleep(DELAYTIME);
			}
		}
		break;
	case '5':
		find_infile_printf(FILENAME);//数据库查询
		break;
	case '6'://原序输出信息
		pri_whole_link(head);
		cout<<"返回主菜单? Y/N\t";
		do
		{
			cin>>ch;
		}while(ch!='Y'&&ch!='y');
		
		break;
	case '7'://排序输出信息
		do
		{
			if((head=printf_sort(head))==NULL)
			{
				cout<<"数据库未加载"<<endl;
				Sleep(DELAYTIME);
				break;
			}
			else
			{
				cout<<"选择其他方式排序? Y/N\t";
				cin>>ch;
			}
		}while(ch=='Y'||ch=='y');
		
		break;
	case '8':
		free_link(head);//释放链表空间
		exit(0);
		break;
	default:
		cout<<"输入有误!请重新输入!"<<endl;
		Sleep(DELAYTIME);
		break;
	}
	}
}
STUDENT * new_student()
//功能:创建学生信息(通过链表)
//返回值:头结点指针
{
	STUDENT *pnew,*p,*head;
	float *pfloat;
	char ch;
	head=NULL;
	do
	{
		system("cls");
		pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);
		cout<<"请输入学生的学号(0表示取消): ";
		cin>>pnew->num;
		if(0>=pnew->num)
		{
			break;
		}
		cout<<"请输入学生的姓名:";
		cin>>pnew->name;
while(1)
		{
			
			cout<<"请输入学生的性别:0/1\t";
			cin>>pnew->sex;
			if(pnew->sex&&pnew->sex-1)
			{
				cout<<"性别输入错误,0表示女性,1表示男性,请重新输入"<<endl;
			}
			else
			{
				break;
			}
		}
cout<<"请依次输入学生的数学、英语、政治、语文成绩:"<<endl;
	
		for(pnew->total=0,pfloat=&pnew->math;pfloat<&pnew->math+4;)
		{
			cin>>*pfloat;
			if(*pfloat<0||*pfloat>150)
			{
				cout<<"成绩输入错误,只能为0~150"<<endl;
			}
			else
			{
				pnew->total+=*pfloat;
				pfloat++;
			}
		}
		if(head==NULL)
		{
			head=pnew;
		}
		else
		{
			p->next=pnew;
		}
		p=pnew;
		pnew->next=NULL;
		cout<<"##########################该学生信息已生成#########################\n";
cout<<"建立另一个学生的信息? Y/N\t";
		cin>>ch;
	}while(ch=='Y'||ch=='y');
return head;
}
STUDENT* create_linkbyfile(char *filename)
//功能:读取文件,创建链表
//参数:如果filename不为空,则打开该文件,如果filename为空,要求输入文件位置
//创建的链表的所有结点的next全部修改,指向物理地址上的下一个结点
{
	system("cls");
	FILE *fp;
	STUDENT *head,*ptemp,*pnew;
	head=NULL;//初始化head为空
	if(filename==NULL)//若filename为空,要求输入文件绝对地址
	{
		char file_name[256];
		cout<<"请输入数据库文件的路径:"<<endl;
		cin>>file_name;
		if(NULL==(fp=fopen(file_name,"rb")))
		{
			cout<<"数据库连接失败\n";
			return 0;
		}
	}
	else
	{
		if(NULL==(fp=fopen(filename,"rb")))
		{
			cout<<"数据库连接失败\n";
			return 0;
		}
	}
	for(ptemp=NULL;;)
	{
		pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);
		if(fread(pnew,sizeof(STUDENT),1,fp)!=NULL)
		{
			if(ptemp!=NULL)
			{
				ptemp->next=pnew;
			}
			else
			{
				head=pnew;
			}
			ptemp=pnew;
		}
		else
		{
			if(ptemp!=NULL)
			{
				ptemp->next=NULL;
			}
			else
			{
				head=NULL;
			}
			free(pnew);
			break;
		}
	}
	fclose(fp);
	return head;
}
STUDENT *del_info(STUDENT *head)
//根据学号,删除链表的结点
{
	system("cls");
	STUDENT *p1,*p2;
	int num;
	if (head==NULL)
	{
		cout<<"数据库未加载"<<endl;
		Sleep(DELAYTIME);
		return 0;
	}
	cout<<"请输入要删除学生的学号:";
	cin>>num;
	for(p1=head;p1!=NULL;)
	{
		if(p1->num==num)//找到
		{
			if(p1==head)//要删除的结点是头结点
			{
				head=p1->next;
			}
			else
			{
				p2->next=p1->next;
			}
			cout<<"成功删除!!";
		}
		p2=p1;
		p1=p1->next;
	}
	return head;
}
int save_info(char *filename,STUDENT *head,int flag)
//功能:将链表按Binary写入文件末尾
//参数:
//1.filename文件名,绝对地址
//2.head指向链表的头结点
//3.flag 0追加或1覆盖数据
//返回值:失败则返回0
{
	system("cls");
	FILE *fp;
	STUDENT *p;
	char openmethod[8];
	if(flag==0)
	{
		strcpy(openmethod,"ab+");//追加
	}
	else
	{
		strcpy(openmethod,"w");//覆盖
	}
	if(NULL==(fp=fopen(filename,openmethod)))//
	{
		cout<<"数据库连接失败"<<endl;
		Sleep(DELAYTIME);
		return 0;
	}
	else
	{
		for(p=head;p;p=p->next)
		{
			if((fwrite(p,sizeof(STUDENT),1,fp))==NULL)
			{
				cout<<"数据库创建失败"<<endl;
				return 0;
			}
		}
	}
	fclose(fp);
	return 1;
}
int find_infile_printf(char *filename)
//功能:根据学号和姓名来查询某个学生
//参数:filename数据库文件
//返回值:失败返回0
//直接搜索文件,缺点是速度慢
//也可先根据文件创建链表,再搜索链表,缺点是如果文件较大,占用内存多
{
	system("cls");
	FILE *fp;
	STUDENT stu;
	int num;
	char stu_name[64];
	char ch;
	if(filename==NULL)
	{
		return 0;
	}
	do
	{
		memset(stu_name,0,sizeof(stu_name));
		cout<<"查询学号或查询姓名? 1查询学号 0查询姓名";
		//flag=1根据学号来查询,flag=0根据姓名来查询
		cin>>num;
		if(num==1)
		{
			cout<<"输入要查询的学号:";
			cin>>num;
			cout<<"正在为您查询学号为"<<num<<"的学生……"<<endl;
		}
		else if(num==0)
		{
			cout<<"输入要查询的姓名:";
			cin>>stu_name;
			cout<<"正在为您查询姓名为"<<stu_name<<"的学生……"<<endl;
		}
		else
		{
			cout<<"输入有误"<<endl;
			return 0;
		}
		if(NULL==(fp=fopen(filename,"rw")))
		{
			cout<<"数据库连接失败\n";
			return 0;
		}
		else
		{
			while(fread(&stu,sizeof(STUDENT),1,fp)!=NULL)
			{
				if(strcmp(stu.name,stu_name)==0||stu.num==num)
				{
					cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";
					//输出该学生的所有信息
					cout<<stu.num<<"\t"<<stu.name<<"\t"<<stu.sex<<"\t"<<stu.math<<"\t"<<stu.english<<"\t"<<stu.politic<<"\t"<<stu.chinese<<"\t"<<stu.total<<endl; 
					//不加break;可支持多个相同数据的索引
				}
			}
		}
		cout<<"##########################查询完毕#########################\n";
		cout<<"查询另一个学生的信息? Y/N\t";
		cin>>ch;
	}while(ch=='Y'||ch=='y');
	fclose(fp);
	return 1;
}
int pri_whole_link(STUDENT *head)
//功能:显示整条链表的学生信息
//参数:head 头结点指针,如果head为空,返回空
{
	system("cls");
	STUDENT* p;
	if (head==NULL)
	{
		cout<<"数据库未加载"<<endl;
		Sleep(DELAYTIME);
		return 0;
	}
	cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";
	for(p=head;p;p=p->next) 
	{
		cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->math<<"\t"<<p->english<<"\t"<<p->politic<<"\t"<<p->chinese<<"\t"<<p->total<<endl; 
	}
	return 1;
}
STUDENT* printf_sort(STUDENT *head)
//功能:根据学号|某科目成绩|总成绩对链表进行排序,然后输出
//参数:head链表头指针,如果head为空,返回空
//返回值:返回新的链表的头结点指针
{
	system("cls");
	STUDENT *p1,*p2,*ptemp,*pfinished=NULL;
	char num;
	char flag;
	if (head==NULL)
	{
		return 0;
	}
	cout<<"选择排序依据 0.数学成绩1.英语成绩2.政治成绩3.语文成绩4.总成绩\n";
	while(1)
	{
		cin>>num;
		if(num>'4'||num<'0')
		{
			cout<<"输入有误,请重新输入 0~4"<<endl;
		}
		else
		{
			break;
		}
	}
	cout<<"升序/降序输出? 0.降序1.升序";
	while(1)
	{
		cin>>flag;
		if(flag>'1'||flag<'0')
		{
			cout<<"输入有误,请重新输入 0~1"<<endl;
		}
		else
		{
			break;
		}
	}
	
	for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
	//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
	//ptemp作为中介,保存p2的上一个结点
	{
		for(p2=p1;p2->next!=pfinished;)
		{
			if(*(&(p2->math)+num-'0')<*(&(p2->next->math)+num-'0'))//p2的值小于p2->next的值,交换 ptemp p2 p2->next
			{
				if(p2==p1)//头结点要交换
				{
					p1=p2->next;
					p2->next=p1->next;
					p1->next=p2;
					ptemp=p1;
				}
				else
				{
					ptemp->next=p2->next;
					ptemp=p2->next;
					p2->next=ptemp->next;
					ptemp->next=p2;
				}
			}
			else//不需要交换,则p2、ptemp前进1位
			{
				ptemp=p2;
				p2=p2->next;
			}
		}
		pfinished=p2;
	}
	if(flag=='1')
	{
		p1=reverse(p1);
	}
		pri_whole_link(p1);
	cout<<"##########################信息显示完毕#########################\n";
	return p1;
}
void free_link(STUDENT *head)
//释放链表空间,如果head,什么都不做
{
	STUDENT *p1,*p2;
	for(p1=head;p1;p1=p2)
	{
		p2=p1->next;//先保存,否则
		free(p1);//free后 p1->next数据丢失
	}
}
㈨ 数据结构(C语言版)线性表的操作
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
 int *elem;
 int  length;
 int listsize;
}sqlist;
void initlist_sq(sqlist *L){   /*注意这里*/
 L->elem=(int *)malloc(5*sizeof(sqlist)); /*注意这里*/
 if(!L->elem)                           /*注意这里*/
  exit(0);
 L->length=0;                        /*注意这里*/
 L->listsize=5;                     /*注意这里*/
}
int main()
{
 int i;
 sqlist p;
 initlist_sq(&p);   /*注意这里*/
 for(i=0;i<5;i++)
 {
  printf("%d ",i);
  scanf("%d",&p.elem[i]);
  p.listsize++;
 }
 printf("%d\n",p.listsize);
 for(i=0;i<5;i++)
 {
  printf("%d\n",p.elem[i]);
  p.listsize--;
 }
 printf("%d",p.listsize);
}
//---------------------------------------------------------------------------
