怎样创建一个线性链表(C语言)?

供稿:hz-xin.com     日期:2025-01-13
怎样创建线性表(C语言)?

#include"stdio.h"
#include

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("
"); //输出顺序表h

printf("该单链表的长度为:");
printf("%d",ListLength(h)); printf("
"); //输出顺序表h的长度
if(ListEmpty(h)) printf("该单链表为空。
");
else printf("该单链表不为空。
"); //判断顺序表h是否为空

GetElem(h,3,e);printf("该单链表的第3个元素为:");
printf("%c",e); printf("
"); //输出顺序表h的第3个元素
printf("该单链表中a的位置为:");
printf("%d",LocateElem(h,'a')); printf("
"); //输出元素'a'的位置

ListInsert(h,4,'f'); //在第4个元素位置插入'f'素
printf("在第4 个元素位置上插入'f'后单链表为:");
DispList(h); printf("
"); //输出顺序表h

ListDelete(h,3,e); //删除L的第3个元素
printf("删除第3个元素后单链表为:");
DispList(h); printf("
"); //输出顺序表h

DestroyList(h); //释放顺序表h
return 0;
}

线性链表是一种数据结构。
使用指针在线性表的各个节点进行连接。
struct NODE
{
int value;
NODE* next;
}
这种结构就是一种线性表的数据结构咯,你使用next指针指向下一个节点。

可以用头插法或尾插法
(下面用尾插法)
思想为:让你输入一串字符串, 为每个字符创建一个节点,添加到链表的后面.直到输入的字符为@为止.

#include <stdio.h>
#include <malloc.h>

typedef char datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *p,*q,*head;

main()
{
char c;
head = (linklist *)malloc(sizeof(linklist));
head->next = NULL;
p = head;
c = getchar();
while(c != '@')
{
q = (linklist *)malloc(sizeof(linklist));
q->data = c;
q->next = NULL;
p->next = q;
p = p->next;
c = getchar();
}
}

可以在 main() 最后加上
for(p=head->next; p!=NULL; p=p->next)
{
printf("%5c", p->data);
}
来测试结果,本人已经TC 2.0下面测试通过.

可以用头插法或尾插法
(下面用尾插法)
思想为:让你输入一串字符串, 为每个字符创建一个节点,添加到链表的后面.直到输入的字符为@为止.

#include <stdio.h>
#include <malloc.h>

typedef char datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *p,*q,*head;

main()
{
char c;
head = (linklist *)malloc(sizeof(linklist));
head->next = NULL;
p = head;
c = getchar();
while(c != '@')
{
q = (linklist *)malloc(sizeof(linklist));
q->data = c;
q->next = NULL;
p->next = q;
p = p->next;
c = getchar();
}
}

可以在 main() 最后加上
for(p=head->next; p!=NULL; p=p->next)
{
printf("%5c", p->data);
}
来测试结果,本人已经TC 2.0下面测试通过.

# include <stdio.h>
# include <stdlib.h>
# define StopCondition  t!=0        //根据需求修改 

typedef int DataType;        //节点的数据域 的数据类型,视情况而定

typedef struct node
{
    DataType  data;
    struct node *next;
} Node;

typedef Node* List;




/*********根据需求,有可能变更的函数接口*********/ 
void  GetData(DataType *px);
void PrintData(DataType x);


/********标准链表接口******/

void PrintList(List li);
List CreatList();
void DestroyList(List li);



//测试main函数 
int main(void)
{
    
    List myList;
    myList = CreatList();    //创建链表 ,输入0就结束输入 
      
    PrintList(myList);      //打印 
    
    DestroyList(myList);    //销毁 
    
    return 0;






void  GetData(DataType *px)
{
    
    while(1!=scanf("%d",px))  ////
    {
        fputs("输入有误,请重新输入
",stderr);
        while(getchar()!='
')
        ;
    }
    
}

void PrintData(DataType x)
{
    
    printf("%d
",x); //////
}


List CreatList()
{  //创建一个带头节点的链表
    Node * phead;
    Node *p1,*p2;
    DataType t;
    
    //创建头节点
    phead = (Node*)malloc(sizeof(Node));
    if(phead==NULL)
    {
        fputs("memory allocate error
",stderr);
        exit(-1);
    }
    phead->next=NULL;
    
    //开始创建数据节点
    GetData(&t); //获取节点的数据
    while(StopCondition)
    {
        //开辟内存
        p1 = (Node*)malloc(sizeof(Node));
        if(p1==NULL)
        {
            fputs("memory allocate error
",stderr);
            exit(-1);
        }
        //填补节点的数据(数据域和指针域)
        p1->data = t;
        p1->next=NULL;
        
        //链接
        if(phead->next ==NULL)
         phead->next = p1; 
         
        else
         p2->next = p1;
         
        
        //重置 
        p2=p1;
        
        //再次获取数据,为下次创节点准备
        GetData(&t);
    }
    
    return phead;    //返回链表的头头节点的地址
    
    
}



void PrintList(List li)
{    //打印链表的所有节点,
    Node*p = li->next;
    
    while(p!=NULL)
    {
        PrintData(p->data);
        
        p=p->next;
        
    }
    
    
    
    
}


void DestroyList(List li)
{  
    //销毁链表
    Node*p=li;
    Node*t;
    while(p!=NULL)
    {
        t=p;
        free(t);
        p=p->next;
    }
    
    
    
}


下面是我设计的一个链表的创建和遍历:/*结构体链表的创建和遍历*/
//本程序采用c++程序,设计到C++的地方,我在注释中,给你表示出来。
#include <iostream.h>//头文件声明,相当于#include <stdio.h>

struct Student//一个学生结构体的声明;
{
long number;
float score;
Student *next;//这是一个自身调用。注意是一个结构体的指针;
};

Student *head;//这是一个全局变量;下面有对它的使用;

Student *Create()//函数,用来创建链表;
{
Student *pS;//这个结构指针,是用来创建节点的;
Student *pEnd;//这个结构指针,是用来传递*pS给它的;
pS=new Student;//这是C++中的用法,相当于C
中的malloc函数;具体使用,请参考一下课本;
cin>>pS->number>>pS->score;//给pS输入值;CIN相当于C中的SCANF;
head=NULL;//这里是将头指针设为空值;
pEnd=pS;

while(pS->number!=0)//当输入的number值是0时,结束循环;
{
if(head==NULL)
head=pS;
else
pEnd->next=pS;

pEnd=pS;
pS=new Student;
cin>>pS->number>>pS->score;
}

pEnd->next=NULL;
delete pS;
return (head);
}

void ShowList(Student *head)
{
cout<<"now the items of list are:\n";
while (head!=NULL)
{
cout<<head->number<<","<<head->score<<endl;
head=head->next;
}
}

void main()
{
ShowList(Create());
}

那么typedey struct node是什么意思呢
答: 是给结构“struct node”起的名字“node”,以后就可以直接用“node”定义变量,就像用“int”……

还有struct node *next?
答: 是链表中指向节点的指针

C语言创建链表,函数调用部分
\/\/建立单链表子函数 LNode *Create_LinkList(){ LNode *s,*head,*L;int i=0,x; \/\/定义指向当前插入元素的指针 while(1) { scanf("%d",&x); if(-1==x) { return head; break;} s= (LNode *)malloc(sizeof(LNode)); \/\/为当前插入元素的指针...

建立一个链表,从键盘输入字符,当输入字符0时停止输入,输出输入的字符...
我以前写过一个小程序,其中有一部分就是这个 include<stdio.h> include<malloc.h> typedef struct list { int number;struct list *link;}linklist, Node;linklist *creatlist1(linklist *head);\/\/首插创建链表 linklist *creatlist2(linklist *head);\/\/尾插创建链表 void showlist(linklist*...

用C语言实现线性表的顺序存储(创建,插入,删除和查找)
\/\/释放链表空间,如果head,什么都不做{ STUDENT *p1,*p2; for(p1=head;p1;p1=p2) { p2=p1->next;\/\/先保存,否则 free(p1);\/\/free后 p1->next数据丢失 }} 追问 用C语言,不是C++啊! 追答 没多大差啊,就一个cout 一个cin,替换成printf 和scanf就可以了啊 已赞过 已踩过< 你对这个回答的评价...

C语言如何建立一个列表,编程怎么编,举例说一下,谢谢啦
首先定义一个链表。struct node { int id;struct node * next;};接下来写一些操作的函数(插入,删除等等)。插入函数:struct node* insert(struct node* pNode, int iTemp){ \/\/判断 pNode 是否为空。if(pNode==NULL){ \/\/这个节点是空,返回错误。return NULL;} \/\/ 创建一个新的节点。str...

求大神救急,编写C语言程序,内容是建立一个链表,还有链表的插入与删除...
include<iostream> using namespace std;typedef struct lnode { int data;lnode *next;}lnode,*linklist;int m;int listinsert(linklist &l,int i,int e)\/\/在带头节点的单链表中第i个元素插入元素e { int j=0;linklist p,s;p=new lnode;p=l;s=new lnode;while(p&&jnext;++j;} ...

用C语言代码创建一个单链表,包含(1)创建链表(2)求表长(3)链表的查找...
}\/\/ 创建链表LinkList CreateList() {int data;pNode p;LinkList head = GetEmptyList();p = head;printf("输入一个整数('q' to quit):");while(scanf("%d",&data) == 1) {p->next = (pNode)malloc(sizeof(struct list));p->next->data = data;p = p->next;printf("输入...

用c语言描述实现线性链表求表长的算法
实现线性链表求表长的算法,使用C语言描述如下:定义一个指向链表头结点的指针p,初始指向链表头结点l。定义一个整型变量len,初始值为0。使用循环结构,条件为p不等于NULL,循环执行以下操作:在循环体内,len的值加1。每次循环结束后,p向后移动到下一个节点。循环结束后,返回len作为链表的长度。

C语言中将键盘输入的信息存入链表
include <stdio.h> include <stdlib.h> define M 2 int n,i,j,x; \/\/定义变量 ,M为行,n为列,i、j为循环变量,x为自变量 typedef struct Node \/\/建立线性链表 { int a[M][1];\/\/定义一个列数组 struct Node*next;\/\/指针成员 }LNode;void create(LNode*head);\/\/创建线性链表...

从键盘敲入学生的成绩,建立一个线性表
if (!L) exit(1);L->next=NULL;cout<<"链表已经建立\\n";} \/\/\/ \/\/ \/*删除结点*\/\/\/ \/\/\/ int listdelete(link &L,int i,ElemType &e){ link p,q; int j;p=L;j=0;while(p->next&&jnext;++j;} q=p->next;p->next=q->next;e=q->date;free(q);cout<<"结点已经删除...

用C语言编写一个完整的实现单链表(带头结点)的基本操作(包括查找、插 ...
if (NULL == pHead){ printf("动态内存分配失败!");exit(-1);} PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入链表节点的个数:");scanf("%d", &num);for (i = 0; i < num; ++i){ PNODE pNew;pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){ ...