使用结构体:
typedef struct node{
int data;
struct node* next;
}Node;
就可以实现,以上是一个单链表的节点元素,每个节点的next指向下一个节点,就可以实现链式存储了。遇到其他类似的问题,可以根据需要设置相应的指针域。
② 怎样用c语言实现稀疏矩阵的带行指针向量的链接储存
double fMatrix[10][10]={...};
这是静态数组表示矩阵,当然你可以使用链表的方式来存储
一个链表表示一行,每行存储链表的头元素指针就行。。。
③ 在C语言中,存储类别包括什么
1、c语言中的存储类型有static 、auto、extern、及register,函数默认的存储类型应该是extern,意思是具有外部链接性的。一般来说,会通过extern来声明函数。
2、比如下面的代码,在1.c中定义一个函数,函数的声明写在1.h头文件中,在2.c中通过添加1.h的头文件,来声明及调用函数f()。
//1.c
void f() { ; }
//1.h
extern void f();
//2.c
#include "1.h"
int main() { f();}
④ c语言用链表存储自动存储柜,每一句什么意思
1、链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。2、例程:
/**对链表的综合操作*功能有建立,排序,插入,删除,输出*/#include<stdio.h>#include<malloc.h>typedef int ElemType;typedef struct NodeType{ElemType data;struct NodeType *next;} NodeType,*LinkType;LinkType create(){//建立链表,返回链表的首地址,头结点没有数据LinkType head,p1,p2;head=(LinkType)malloc(sizeof(NodeType));p1=head;while(p1->data!=0)//当data=0时链表结束{p2=p1;p1=(LinkType)malloc(sizeof(NodeType));printf("Enter student's information:\ndata=");scanf("%d",&p1->data);p2->next=p1;}p2->next=NULL;free(p1);return(head);}void output(LinkType head){//链表的输出,接收链表的首地址head=head->next;while(head!=NULL){printf("data=%d\n",head->data);head=head->next;}}LinkType sort(LinkType head){//链表排序,接收链表首地址,返回链表首地址LinkType ph,p1;ElemType temp;ph=head->next;p1=head->next;while(p1->next!=NULL)//冒泡法{ph=head;while(ph->next!=NULL){if(ph->data>ph->next->data)//按data由小到大排序{temp=ph->data;ph->data=ph->next->data;ph->next->data=temp;}ph=ph->next;}p1=p1->next;}return(head);}LinkType del(LinkType head){//删除结点,接收链表的首地址,返回链表的首地址ElemType DelData;LinkType ph,p;ph=head->next;printf("Enter the data you want to del:\nDelData=");scanf("%d",&DelData);while(ph!=NULL && ph->data!=DelData)//寻找要删除的结点{p=ph;ph=ph->next;}if(ph==NULL)//没有找到要删除的结点{printf("Enter error!\n");return(head);}else{if(ph==head->next)//删除头结点{head->next=ph->next;}else//删除其它结点{p->next=ph->next;}}free(ph);return(head);}LinkType insert(LinkType head){//插入结点,接收链表首地址,返回链表首地址LinkType ph,p,insert,temp;insert=(LinkType)malloc(sizeof(NodeType));printf("Enter the data you want to insert:\ndata=");scanf("%d",&insert->data);ph=head->next;while(ph!=NULL && ph->data < insert->data)//寻找插入的位置{p=ph;ph=ph->next;}if(head->next->data > insert->data)//插入头部{temp=head->next;head->next=insert;insert->next=temp;}else//插入到其它地方{p->next=insert;insert->next=ph;}return(head);}void main(){LinkType head;head=create();output(head);printf("\n\n");head=sort(head);output(head);printf("\n\n");head=del(head);output(head);printf("\n\n");head=insert(head);output(head);}
⑤ 关于C语言中,链表数据的文件储存和提取。
当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
Consumer*read_list()
{
FILE*fp;
if((fp=fopen("CONSUMER.dat","rb"))==NULL)
{
printf("无法读取CONSUMER.dat ");
returnNULL;
}
intsign;
Consumer*s,*p,*head;
head=(Consumer*)malloc(SIZE_C);
if(head==NULL)
{
printf("读取失败!内存空间申请不足! ");
returnNULL;
}
fseek(fp,0,SEEK_END);
if(ftell(fp)==0)
{
returnNULL;
}
p=head;
p->next=NULL;
while(feof(fp))
{
s=(Consumer*)malloc(SIZE_C);
//fread(s,SIZE_C,1,fp);
fread(s,sizeof(char),SIZE_C,fp);
p->next=s;
p=s;
p->next=NULL;
}
fclose(fp);
returnhead;
}//读取文件到链表
intsave_consumer(Consumer*p)
{
FILE*fp;
Consumer*head;
head=p;//p为已经构建好的链表
//if((fp=fopen("CONSUMER.dat","ab+"))==NULL)
if((fp=fopen("CONSUMER.dat","wb"))==NULL)
{
printf("无法打开CONSUMER.dat! ");
return-1;
}
while(p!=NULL)
{
//fwrite(p,SIZE_C,1,fp);
fwrite(p,sizeof(char),SIZE_C,fp);
p=p->next;
}
fclose(fp);
return1;
}//储存链表到文件
⑥ C语言编程 帮帮忙哦~~比较顺序存储和链接存储两种存储结构的优缺点
(1) 分别用顺序存储和链接存储实现线性表的基本操作
顺序存储:
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define List_Init_Size 10
#define ListIncrement 2
typedef char ET;
typedef ET * Ep;
typedef int Status;
typedef struct {
ET *elem;
int Length;
int ListSize;
} sqlist;
SqList La,Lb,Lc;
/*This program provide some functions for linear table.
Header file writen user are sqlist.h */
#include"stdio.h"
#include"alloc.h"
#include"sqlist.h"
SqList La,Lb,Lc;
/*Output the linear table emements. */
void printsq(SqList *L) {
int i;
printf("Size=%d Length=%d ",L->ListSize,L->Length);
for (i=0;i<L->Length;i++)
printf("%3c",L->elem[i]);
printf("\n");
}
Status InitList( SqList *L){
L->elem=(Ep)malloc(List_Init_Size*sizeof(ET));
if(L->elem==NULL)
exit(OVERFLOW);
L->Length=0;
L->ListSize=List_Init_Size;
return OK;
}
Status Init(SqList *L) {
int done=TRUE;
ET e;
InitList(L);
while (done) {
scanf("%c",&e);
if (e != '\n')
ListInsert(L,L->Length+1,e);
else done = FALSE;
}
}
/*Insert the ith data into a linear table */
Status ListInsert(SqList *L,int i,ET e){
ET *p,*q;
if (i<1 || i>L->Length+1) return ERROR;
if(L->Length >= L->ListSize){
p=(ET*)realloc(L->elem,(L->ListSize+ListIncrement)*sizeof(ET));
if (p==NULL)exit(OVERFLOW);
L->elem=p;L->ListSize+=ListIncrement;
}
q=L->elem+i-1;
for(p=L->elem+L->Length-1;p>=q;--p)
*(p+1)=*p;
*q=e;
++L->Length;
return OK;
}
Status Insert(SqList *L) {
int i,flag;
ET data;
printf("Please input the position and data: ");
scanf("%d",&i);
printf("Please input the data : ");
data = getche();
flag = ListInsert(L,i,data);
return flag;
}
/*Delete the ith data from a linear table*/
Status ListDelete(SqList *L,int i,ET *e) {
ET *p,*q;
}
Status Delete(SqList *L) {
int i,flag;
ET e;
}
/* Get element from a linear table. */
Status GetElem(SqList *L , int i , ET *e){
}
int LocateElem(SqList *L,ET e) {
int i,flag=FALSE;
}
/*Merge two linear table into one. If they have the same elements,
keep one of them and delete another. */
void Union( SqList *La ,SqList *Lb){
int i;
ET e;
}
}
/*Merge two sequence into one,don't change any elements in
these two linear tables. Join two sequence to one. */
void MergeList(SqList *L1,SqList *L2,SqList *L3) {
int i=0,k=0,j=0;
ET ai,bj;
while((i<L1->Length)&&(j<L2->Length)) {
ai=*(La.elem+i);
bj=*(Lb.elem+j);
if(ai<=bj) {
ListInsert(L3,++k,ai);
++i;
}
else {
ListInsert(L3,++k,bj);
++j;
}
}
while (i<L1->Length){
ai=*(L1->elem+i);
ListInsert(L3,++k,ai);
i++;
}
while(j<L2->Length){
bj=*(L2->elem+j);
ListInsert(L3,++k,bj);
j++;
}
}
/*List the Menu*/
void MenuList() {
printf("\n\n\n**************************\n");
printf(" 1 ------- Insert LA\n");
printf(" 2 ------- Insert LB\n");
printf(" 3 ------- Union LA and LB\n");
printf(" 4 ------- Delete LA\n");
printf(" 5 ------- Delete LB\n");
printf(" 6 ------- Merge LA and LB to LC\n");
printf(" 7 ------- print Linear\n");
printf(" 8 ------- Exit\n");
printf("**************************\n");
}
/*Select the menu */
void MenuSelect( ){
int select,done=1;
while (done) {
MenuList( );
printf("input the operating code : ");
scanf("%d",&select);
switch(select){
case 1: Insert(&La);break;
case 2: Insert(&Lb);break;
case 3: Union(&La,&Lb);break;
case 4: Delete(&La);break;
case 5: Delete(&Lb);break;
case 6: InitList(&Lc);
MergeList(&La,&Lb,&Lc);
printf("LC: ");printsq(&Lc);
break;
case 7: printf("LA: ");printsq(&La);
printf("LB: ");printsq(&Lb);break;
case 8: done=0;break;
default: printf(" ERROR\n");
}
}
}
main( ){
printf("Please input the init LA's element : ");
Init(&La) ;
printf("Please input the init LB's element : ");
Init(&Lb) ;
MenuSelect();
}
链接存储:
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define List_Init_Size 10
#define ListIncrement 2
typedef char ET;
typedef ET * Ep;
typedef int Status;
typedef struct LNode{
ET data;
struct LNode *next;
}LNode, *LinkList;
/*LinkList La,Lb,Lc;*/
#include "stdio.h"
#include "alloc.h"
#include "llist.h"
/*Display the linklist's elements. */
void printlk(LinkList L) {
}
/*Creat linklist from head node. */
void CreatList( LinkList *L,int n){
int i;
LinkList p,q;
ET str[20],c;
p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
*L = q = p;
printf("Please input the data : ");
for (i=n;i>0;i--) {
p=(LinkList)malloc(sizeof(LNode));
c = getche(); /*scanf("%c",&c);*/
printf("\n\n");
p->data = c;
p->next = q->next;
q->next = p;
}
}
/*Init the linklist. */
void Init(LinkList *L) {
int n;
printf("Please input the number of the node : ");
scanf("%d",&n);
CreatList(L,n);
}
/* Get the value of element I; */
int GetElem(LinkList L,int i,ET *e) {
/* Add your own codes. */
}
/*Insert a element after I */
int ListInsert(LinkList *L,int i,ET e) {
/* Add your own codes. */
}
/*Delete the element I */
int ListDelete(LinkList *L,int i,ET *e)
{
/* Add your own codes. */
}
int Insert(LinkList *L) {
int i,flag;
ET data;
printf("Please input the position : ");
scanf("%d",&i);
printf("Please input the data : ");
data = getche(); /*scanf("%c",&data);*/
flag = ListInsert(L,i,data);
return flag;
}
Status Delete(LinkList *L) {
int i,flag;
ET e;
printf("Please input the number : ");
scanf("%d",&i);
flag = ListDelete(L,i,&e);
printf("Deleted element is %c\n",e);
return flag;
}
/*Find the element's position. */
int LocateElem(LinkList L,ET e) {
int i=0;
LinkList p;
p = L->next;
while (p) {
i++;
if (p->data == e) return i;
}
return 0;
}
/*Add the Lb after the La. */
void Union( LinkList *La ,LinkList *Lb){
LinkList pa,pb;
/* Add your own codes. */
}
/*Merge two sequence into one,don't change any elements in
these two link lists. Join two sequence to one. */
void MergeList(LinkList *L1,LinkList *L2,LinkList *L3) {
LinkList pa,pb,pc;
/* Add your own codes. */
}
/*List the Menu*/
void MenuList() {
printf("\n\n\n==========================\n");
printf(" 1 ******* Insert LA\n");
printf(" 2 ******* Insert LB\n");
printf(" 3 ******* Delete LA\n");
printf(" 4 ******* Delete LB\n");
printf(" 5 ******* Union LA and LB\n");
printf(" 6 ******* Merge LA and LB to LC\n");
printf(" 7 ******* print LinkList\n");
printf(" 8 ******* Exit\n");
printf("==========================\n");
}
/*Select the menu */
void MenuSelect(LinkList *La,LinkList *Lb){
int select,done=1;
LinkList Lc;
while (done) {
MenuList( );
printf("input the operating code : ");
scanf("%d",&select);
switch(select){
case 1: Insert(La);break;
case 2: Insert(Lb);break;
case 3: Delete(La);break;
case 4: Delete(Lb);break;
case 5: Union(La,Lb);break;
case 6: MergeList(La,Lb,&Lc);
printf("LC: ");printlk(Lc);
break;
case 7: printf("LA: ");printlk(*La);
printf("LB: ");printlk(*Lb);
break;
case 8: done=0;break;
default: printf(" ERROR\n");
}
}
}
main( ){
LinkList La,Lb;
printf("LA ");
Init(&La) ;
printlk(La);
printf("LB ");
Init(&Lb) ;
printlk(Lb);
MenuSelect(&La,&Lb);
}
(2) 比较两者的优缺点,并说明两者的适用场合
顺序存储:
要求存储的空间物理上连续,但是可以直接完成查找。
链接存储:
不用物理相邻,逻辑上采用指针连续,储存要求不高,但是查找要花更多的时间,修改很方便。
所以,在建立的线性表不需要进行大量的修改,需要查找的时候,就用顺序存储;不经常查找,但是经常进行修改的时候,就用链式存储。
自己的理解,应该正确~
⑦ c语言编程 关于顺序存储与链式存储
<p></p>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct
node
{
int
data;
node
*next;
};
node
*create(int
a[],int
len)
{
int
i;
node
*head=new
node;
head->data=a[0];
node
*p=head;
node
*q;
for(i=1;i<len;i++)
{
q=new
node;
q->data=a[i];
p->next=q;
p=q;
}
p->next=NULL;
return
head;
}
node
*
insert(node
*head,int
k)
{
node
*temp=new
node;
temp->data=k;
temp->next=head;
head=temp;
return
head;
}
node
*dele(node
*head,int
m)
{
int
i;
node
*p=head;
node
*x=new
node;
node
*y=new
node;
if(m==1)
{
node
*q=head;
head=head->next;
free(q);
}
else
{
for(i=1;i<m;i++)
{
x=p;
p=p->next;
y=p->next;
}
x->next=y;
free(p);
}
return
head;
}
void
main()
{
int
a[10]={1,2,3,4,5,6,7,8,9,10};
int
len=10;
node
*head=new
node;
head=create(a,len);
node
*p=head;
printf("原数组为:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
printf("\n输入要插入的元素:");
int
k;
scanf("%d",&k);
head=insert(head,k);
p=head;
printf("增加元素后的数组为:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
printf("\n要删除的元素位置为:");
int
m;
scanf("%d",&m);
head=dele(head,m);
p=head;
printf("删除元素后的数组为:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
}<p>此处为链表实现的方式,链表的好处在于内存不必连续,并且顺序存储
</p>
<p>顺序存储结构的特点是:连续的内存,随机存储。</p>
⑧ (C语言)线性表顺序存储与链接存储的建立,插入,删除,搜索,替换与输出
http://blog.csdn.net/andrew_yt/article/details/8023709
这个是线性存储的操作
http://blog.csdn.net/andrew_yt/article/details/8024771
这个是单链表的操作
⑨ c语言如何用文件存储数据
具体操作步骤如下:
1、首先,创建一个新文件夹,在该文件夹中创建一个文档,如下图所示,然后进入下一步。
⑩ 用C语言实现删除链接存储线性表节点的源程序
oc(sizeof(struct studinf))
表示开辟一段strunt studinf大小的内存空间,并把这空间的首地址赋值给p1
head=p1;p2=p1;//p2指向第一个空间
把p1指向的空间地址赋值给p2
p2->next=p1;//此时的p1是指向开辟的第二个空间了
是连接两个开辟空间的语句,通过*next指针连接的;
把p1的值赋值给p2的next,使得p2可以用过next访问后继节点p1;
这样就实现了两个节点的连接