1. 程式人生 > >順序連結串列的插入刪除等操作 C語言

順序連結串列的插入刪除等操作 C語言

//順序表的操作
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//定義表的最大長度
#define MAXLEN 100
//定義結點的關鍵字
typedef struct  
{
char key[10];
char name[10];
int age;
}DATA;
//定義順序表的結構
typedef struct  
{
DATA ListData[MAXLEN+1];
//表的長度
int Listlen;
}SLType;
//初始化順序表
void SLInit(SLType *SL)
{
SL->Listlen=0;
//SL->ListData=0;
}
//求順序表的長度
int SLLength(SLType *SL)
{
return (SL->Listlen);
}
//插入
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->Listlen>=MAXLEN)
{
printf("順序表已滿,不能插入結點!\n");
//返回
return 0;
}
if(n<1||n>SL->Listlen-1)
{
printf("插入元素錯誤,不能再插入元素!\n");
return 0;
}
for(i=SL->Listlen;i>=n;i++)
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
//插入節點後長度增加1
SL->Listlen++;
return 1;
}
//增加元素到順序表的尾部
int SLAdd(SLType *SL,DATA data)
{
if(SL->Listlen>=MAXLEN)
{
printf("線性表已經滿了,不能再新增!\n");
return 0;
}
SL->ListData[++SL->Listlen]=data;
return 1;
}
//刪除順序表中某個資料元素
int SLDelete (SLType *SL,int n)
{
int i;
//刪除失敗
if(n<1||n>SL->Listlen+1)
{
printf("刪除錯誤結點,不能刪除!\n");
return 0;
}
//刪除後順序表中的資料前移
for(i=0;i<SL->Listlen;i++)
{
SL->ListData[i]=SL->ListData[i++];
}
SL->Listlen--;//元素個數減少1
return 1;


}
//根據序號返回資料元素
DATA *SLFindByNum(SLType *SL,int n)
{
if(n<1||n>SL->Listlen+1)
{
printf("結點序號錯誤\n");
return NULL;
}
//返回要查詢的資料
return &(SL->ListData[n]);
}
//按照關鍵字查詢資料
int SLFindByCont(SLType *SL,char *key)
{
int i;
for(i=1;i<=SL->Listlen;i++)
{
//如果找到所需的結點 就返回
if(strcmp(SL->ListData[i].key,key)==0)
{
//返回結點序號
return i;
}
//否則就沒找到  ?
return 0;
}
//return 0;
}
//顯示順序表中的所有結點
int SLAll(SLType *SL)
{


int i;
for (i=1;i<=SL->Listlen;i++)
{
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
return 0;
}
int main()
{
int i;
//定義順序連結串列
SLType SL;
//結點儲存資料
DATA data;
//結點儲存指標
DATA *pdata;
//關鍵字
char key[10];
printf("順序表操作演示:\n");
//初始化順序表
SLInit(&SL);
printf("初始化順序表完成!\n");
//迴圈新增結點
do 
{
printf("輸入新增的結點(學號,姓名,年齡):");
//清空輸入緩衝區
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
//跳出死迴圈
if(data.age)
{
//新增結點失敗
if(!SLAdd(&SL,data))
{
break;
}
}
//跳出死迴圈
else
{
break;
}
} while (1);
printf("\n順序表中的結點順序為:\n");
//顯示所有的資料
SLAll(&SL);
//清空緩衝區
fflush(stdin);
printf("\n要取出的結點的序號:");
//輸入結點序號
scanf("%d",&i);
//按照序號查詢結點
pdata=SLFindByNum(&SL,i);
//若返回的結點非空
if(pdata)
{
printf("第%d個結點為:(%d,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
//清空輸入緩衝區
fflush(stdin);
printf("要查詢的結點的關鍵字:\n");
scanf("%s",key);
i=SLFindByCont(&SL,key);
//按序號查詢,返回結點指標
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d個結點為:(%s,%s%d)\n",pdata->key,pdata->name,pdata->age);
getchar();
return 0;
}
}