‘壹’ 数据结构 c语言版 ——顺序表的查找、插入与删除
#include<stdio.h>
#include<stdlib.h>
#define N 10 //顺序表的最大容量
int length=0; //顺序表的当前元素个数
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储的空间初始化分配量
#define LISTINCREAMENT 10 //线性表存储空间的分配增量
typedef struct LNode//线性单链表存储结构
{
int data;
struct LNode *next;
}LNode,*LinkList;
int CreatList_L(LinkList&L)//创建一个线性链表
{
L=(LinkList)malloc(sizeof(LNode));//分配一个空间给链表,作为头结点
if(!L) exit(OVERFLOW);
L->next=NULL;
return OK;
}
int DestroyList_L(LinkList &L)//销毁链表
{
if(L) free(L);
return OK;
}
int ListInsert_L(LinkList&L,int i,int e)//再练表的第i个元素前插入一个元素e
{
LinkList p=L;//p指针定位于i-1
LNode *s;
int j=0;
while(p&&j<i-1) {p=p->next;j++;}//定位
if(!p||j>i-1) return ERROR;//如果i<1或大于链表元素个数+1
s=(LNode*)malloc(sizeof(LNode));
if(!s) exit(OVERFLOW);
s->data=e; //完成插入操作
s->next=p->next;
p->next=s;
return OK;
}
int ListDelet_L(LinkList&L,int i,int&e)//删除链表L中的第i个元素,并返回给e;
{
LinkList p=L;
LNode* q;
int j=0;
while(!p&&j<i-1) {p=p->next;j++;}//p指针定位于i-1;
if(!p->next||j>i-1) return ERROR;
e=p->next->data; //完成删除操作
q=p->next;
p->next=p->next->next;
free(q);
return OK;
}
int ListTraverse_L(LinkList L,int n)//链表的遍历
{
int i=0;
if(!L)return ERROR;
L=L->next;
while(L)
{
if(L->data==n)return i;
L=L->next;
i++;
}
return FALSE;
}
int InverseSingleList_L(LinkList &L)
{
if(!L->next||!L->next->next)//如果链表少于2个Node那么链表不需要改变顺序
return OK;
LNode *p,*q;
p=L->next; //第一次因为p是最后一个连接所以把p->next设为空
q=p->next;
p->next=NULL;
p=q;
while(p)
{
q=p->next; //用q去保留p后面一个Node;
p->next=L->next;
L->next=p;
p=q;
}
return OK;
}
int main()
{
int List[N];
LinkList L;
int ch,exit='N';
do
{
system("CLS");
printf("\t\t********************************************\n");
printf("\t\t* 1.创建一个顺序表 .........(1) *\n");
printf("\t\t* 2.在顺序表中查找元表.........(2) *\n");
printf("\t\t* 3.在顺序表中插入元表.........(3) *\n");
printf("\t\t* 4.在顺序表中删除元表.........(4) *\n");
printf("\t\t* 5.退出 .........(5) *\n");
printf("\t\t********************************************\n");
printf("\n请选择操作代码:");
ch=getchar();
switch(ch)
{
case '1':
printf("\n请输入十个元素");
CreatList_L(L);
for(length=0;length<N;length++)
{
scanf("%d",&List[length]);
getchar();
ListInsert_L(L,length+1,List[length]);
}
printf("\n创建成功!");
getchar();
break;
case '2':
scanf("%d",&List[0]);
if(ListTraverse_L(L,List[0]))printf("该元素存在该年表的第%d个位置",ListTraverse_L(L,List[0]));
else printf("不存在该元素");
getchar();
break;
case '3':
scanf("%d%d",&length,&List[0]);
ListInsert_L(L,length,List[0]);
system("pause");
break;
case '4':
scanf("%d",&length);
ListDelet_L(L,length,List[0]);
system("pause");
break;
case '5':
printf("\n您是否真的要退出程序(Y/N):");
getchar();
exit=getchar();
break;
default:
getchar();
printf("\n无效输入,请重新选择...:");
getchar();
break;
}
}while(exit!='y'&&exit!='Y');
}
‘贰’ 数据结构 用C语言实现顺序表的建立及遍历
#include<stdio.h>
#include<malloc.h>
typedefstructnlist
{
int*np;
intlen;//已使用地址个数
intmaxlen;//最大地址个数
}NLT;
NLT*createlist();//创建顺序表
intaddtolist(NLT*nlist);//向顺序表插入元素
voidpList(NLT*nlist);//遍历顺序表
intmain()
{
inti;
NLT*nlist=createlist();
if(nlist)
{
for(i=0;i<nlist->maxlen;i++)
addtolist(nlist);
pList(nlist);
}
return0;
}
voidpList(NLT*nlist)//遍历打印,空格分割,最后一个数后面没有空格
{
inti;
for(i=0;i<nlist->len-1;i++)
printf("%d",nlist->np[i]);
printf("%d",nlist->np[nlist->len-1]);
}
NLT*createlist()
{
NLT*nlist=NULL;
nlist=(NLT*)malloc(sizeof(NLT));
scanf("%d",&nlist->maxlen);
nlist->np=(int*)malloc(sizeof(int)*nlist->maxlen);
if(!nlist||!nlist->np)
{
printf("内存申请失败!
");
returnNULL;
}
nlist->len=0;
returnnlist;
}
intaddtolist(NLT*nlist)
{
if(nlist->len<nlist->maxlen)//如果存储空间未满,保存元素,保存成功返回1失败返回0
{
scanf("%d",&nlist->np[nlist->len]);
nlist->len++;
return1;
}
else//这里可以写当存储满的之后,空间扩容,本题用不到所以我不写了
return0;
}
‘叁’ C语言(数据结构)顺序表的初始化
C语言(数据结构)顺序表的初始化需要申请结点空间。
初始化顺序表
1、/**
2、 * 初始化顺序表
3、 * 返回1 表示初始化成功
4、* 返回0 表示初始化失败
5、*/
6、int initList_sq(SqList &L) { //只有在C++中才会有引用的存在
7、 L.elem = (SeqType *) malloc(sizeof(SeqType) * LIST_INIT_SIZE);
8、 if (!L.elem)
9、 return 0; //内存分配失败,存储空间不够
10、 L.length = 0; //表示顺序表为空
11、 L.listsize = LIST_INIT_SIZE; //表示顺序表里,最大存储单元个数
分配顺序表的存储单元,初始化顺序表属性的值。
‘肆’ 数据结构C语言——顺序表的应用实例
第一个程序有两个错误:
错误一:
SeqList *L;
init_SeqList(L);
应改成:
SeqList s;
SeqList *L = &s;
init_SeqList(L);
错误原因:指针只有在初始化(即只有在指向具体对象)之后才可以参与运算,你只定义了一个指针,并未将指针指向具体的对象,当执行到init_SeqList(L); 这句时,会产生越界报错。
错误二:
printf("%d\t%s\n",L->elem[1].data,L->elem[1].n);
这个语句打印出来的永远是第一个元素,而不是删除的元素,应改成:
printf("%d\t%s\n",L->elem[i].data,L->elem[i].n); //其中i为被删除元素的下标
提示:
给数组赋值时,循环最好从i=0开始,for(i=1;i<=2;i++)你从i=1开始,实际上是将值赋给了数组的第二个元素。
‘伍’ 数据结构实验(C语言): 顺序表实验
//线性表函数操作
#include <stdio.h>
#include <string.h>
#define MaxSize 30
#define Error 0
#define True 1
typedef char ElemType;
typedef struct
{
ElemType elem[MaxSize];
int length;
}SqList; /*顺序表类型定义*/
void InitList(SqList * &L) /*初始化顺序表L*/
{
L = (SqList *)malloc(sizeof(SqList));
L -> length = 0;
}
void DestroyList( SqList *L ) /*释放顺序表L*/
{
free(L);
}
int ListEmpty( SqList *L ) /*判断顺序表L是否为空表*/
{
return( L -> length == 0);
}
int ListLength( SqList *L ) /*返回顺序表L的元素个数*/
{
return( L -> length);
}
void DispList( SqList *L ) /*输出顺序表L*/
{
int i;
if( ListEmpty(L))
return;
for( i = 0; i < L -> length; i++ )
printf("%c", L -> elem[i]);
printf("\n");
}
int GetElem( SqList *L, int i, ElemType &e) /*获取顺序表中的第i个元素*/
{
if( i < 1 || i > L -> elem[i])
return Error;
e = L -> elem[i - 1];
return True;
}
int LocateElem( SqList *L, ElemType e) /*在顺序表中查找元素e*/
{
int i = 0;
while( i < L -> length && L -> elem[i] != e)
i++;
if(i >= L -> length)
return Error;
else
return i+1;
}
int ListInsert( SqList * &L, int i, ElemType e) /*在顺序表L中第i个位置插入元素e*/
{
int j;
if( i < 1 || i > L -> length + 1)
return 0;
i--; /*将顺序表位序转化为elem下标*/
for( j = L -> length; j > i; j--) /*将elem[i]及后面元素后移一个位置*/
L -> elem[j] = L -> elem[j - 1];
L -> elem[i] = e;
L -> length++; /*顺序表长度增1*/
return True;
}
int ListDelete( SqList * &L, int i, ElemType &e) /*顺序表L中删除第i个元素*/
{
int j;
if( i < 1 || i > L -> length)
return Error;
i--; /*将顺序表位序转化为elem下标*/
e = L -> elem[i];
for(j = i; j < L -> length - i; j++)
L -> elem[j] = L -> elem[j + 1];
L -> length--; /*顺序表长度减1*/
return True;
}
void main()
{
SqList *L;
ElemType e;
printf("(1)初始化顺序表L\n");
InitList(L);
printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(L, 1, 'a');
ListInsert(L, 2, 'b');
ListInsert(L, 3, 'c');
ListInsert(L, 4, 'd');
ListInsert(L, 5, 'e');
printf("(3)输出顺序表L:");
DispList(L);
printf("(4)顺序表L长度 = %d\n", ListLength(L));
printf("(5)顺序表L为%s\n", (ListEmpty(L) ?"空" :"非空"));
GetElem(L, 3, e);
printf("(6)顺序表L的第3个元素 = %c\n", e);
printf("(7)元素a的位置 = %d\n", LocateElem(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
ListInsert(L, 4, 'f');
printf("(9)输出新的顺序表L:");
DispList(L);
printf("(10)删除L的第3个元素\n");
ListDelete(L, 3, e);
printf("(11)输出新的顺序表L:");
DispList(L);
printf("(12)释放顺序表L\n");
DestroyList(L);
}
‘陆’ 数据结构(C语言)顺序表的合并
1、c语言是没有引用的,可以使用一个const指针来模拟引用void InitList(SqList *L){L->last=0;}。