當前位置:首頁 » 編程語言 » 鏈表的增刪改查C語言

鏈表的增刪改查C語言

發布時間: 2023-03-17 19:50:53

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
只實現了構造鏈表,並列印出來的功能。
*/

熱點內容
動態規劃01背包演算法 發布:2024-11-05 22:17:40 瀏覽:849
nasm編譯器如何安裝 發布:2024-11-05 22:01:13 瀏覽:178
登錄密碼在微信的哪裡 發布:2024-11-05 22:00:29 瀏覽:737
c防止反編譯工具 發布:2024-11-05 21:56:14 瀏覽:246
安卓虛擬機怎麼用 發布:2024-11-05 21:52:48 瀏覽:343
php時間搜索 發布:2024-11-05 20:58:36 瀏覽:478
燕山大學編譯原理期末考試題 發布:2024-11-05 20:13:54 瀏覽:527
華為電腦出現臨時伺服器 發布:2024-11-05 20:05:08 瀏覽:407
斗戰神免費挖礦腳本 發布:2024-11-05 19:53:25 瀏覽:664
網吧伺服器分別是什麼 發布:2024-11-05 19:45:32 瀏覽:391