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);
}
//---------------------------------------------------------------------------
