问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用C语言编写一个链表?

发布网友 发布时间:2022-04-28 14:05

我来回答

3个回答

热心网友 时间:2022-06-18 22:33

可以用结构体和指针来实现


定义:

定义一个单个元素的结构

typedef struct Chain_tag { // 这里用typedef来定义,方便使用
    int data; // 这里的数据可以是任意类型
    //其他数据
    struct Chain_tag *prev, *next;// 由于Chain为不完全类型,故只能用指针的方式声明
} Chain;


使用:

用单个结构体的指针作为head

#include <malloc.h>

//Chain的定义写在这里

Chain *
alloc_single_chain(int data /*, (其他参数)*/)
{
    Chain *tmp;
    
    tmp = malloc(sizeof(Chain));
    tmp.data = data;
    //...其余数据初始化
    tmp.prev = tmp.next = NULL; // 将前后指针置为NULL
    
    return tmp;
}

void
dispose_chain(Chain *target) //其实这里功能简单,用宏实现也可以
{
    free(target);
    return;
}

int main()
{
    Chain *head;
    Chain *pos;
    
    head = alloc_single_chain(10);//初始化起始结点
    head->next = alloc_single_chain(11);//同理。。下一个结点
    
    for (pos = head; pos; pos = pos->next)//清理垃圾好习惯
    {
       dispose_chain(pos);
    }
    
    return 0;
}

这里有几点要注意:

由于链表用指针来实现,故不要忘记分配内存

垃圾清理时一定要从起始结点开始依次向后释放,以防内存泄漏

热心网友 时间:2022-06-18 22:33

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

struct Node
{
int data;//数据域
struct Node * next;//指针域
};

/*************************************************************************************
  *函数名称:Create
  *函数功能:创建链表.
  *输入:各节点的data
  *返回值:指针head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
  *函数名称:insert
  *函数功能:在链表中插入元素.
  *输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容
  *返回值:无
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
  *函数名称:del
  *函数功能:删除链表中的元素
  *输入:head 链表头指针,p 被删除元素位置
  *返回值:被删除元素中的数据域.如果删除失败返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
  *函数名称:print
  *函数功能:打印链表中的元素
  *输入:head 链表头指针
  *返回值:无
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
  *函数名称:main
  *函数功能:主函数创建链表并打印链表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}

参考资料:百度百科

热心网友 时间:2022-06-18 22:34

#include <stdio.h>
#include <stdlib.h.>

typedef int ElemType;

typedef struct node {
int data;
struct node *prior,*next;
} *SqList;

SqList CreateList1(int n) { // 创建单向循环链表
SqList head,p,q;
head = p = (SqList)malloc(sizeof(node));
for(int i = 0;i < n;i++) {
q = (SqList)malloc(sizeof(node));
q->data = 2*i + 1;
p->next = q;
p = q;
}
p->next = head;
return head;
}

SqList CreateList2(int n) { // 创建单向非循环链表
SqList head,p,q;
head = p = (SqList)malloc(sizeof(node));
for(int i = 0;i < n;i++) {
q = (SqList)malloc(sizeof(node));
q->data = 2*(i + 1);
p->next = q;
p = q;
}
p->next = NULL;
return head;
}

void ChangeList1(SqList head) { // 单向循环链表改为双向循环链表
SqList p,q;
p = head;
q = p->next;
while(q != head) {
q->prior = p;
p = q;
q = q->next;
}
head->prior = q;
}

void ChangeList2(SqList head) { // 单向非循环链表改为双向循环链表
SqList p,q;
p = head;
q = p->next;
while(q != NULL) {
q->prior = p;
p = q;
q = q->next;
}
p->next = head;
head->prior = p;
}

void PrintList1(SqList head) { // 顺向打印非循环链表数据
SqList p = head->next;
while(p != NULL) {
printf("%3d",p->data);
p = p->next;
}
printf("\n\n");
}

void PrintList2(SqList head) { // 反向打印循环链表数据
SqList p = head->prior;
while(p != head) {
printf("%3d",p->data);
p = p->prior;
}
printf("\n\n");
}

void FreeList(SqList head) {
SqList p,q;
p = head;
q = p->next;
while(q != head) {
p = q;
q = p->next;
free(p);
}
free(head);
}

int main() {
SqList head = CreateList2(10); // head为非循环链表
PrintList1(head); // 顺向打印非循环链表
ChangeList2(head);
PrintList2(head);
FreeList(head);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 在C语言中,什么是链表呀? 手机申请QQ号被绑定,怎样解绑手机号? 手机号和qq如何在客户端绑定 新开的qq怎么绑定手机号 QQ怎么绑定手机号来的? 现在QQ怎么绑定手机号的 QQ申请 手机号码绑定的问题 qq怎么和手机号绑定,就是当你输入手机号时,然后输入qq密码,就可以登录qq号那种? 500吨的吊车出租一小时要多少钱 有什么好的澳门特产推荐吗? 澳门特产有哪些?送人比较好的那种 小米5数据线接头和安卓通用吗?手环有没有必要买? 高分求一张兰博基尼的汽车图片 马蹄炒时蔬怎样做的简单营养? 兰博基尼有哪几款跑车 兰博基尼各型号 马蹄怎么炒菜 不锈钢潜水泵的规格型号表 兰博基尼跑车有几款都叫什么名字 马蹄小炒的做法,马蹄小炒怎么做好吃,马蹄小炒 C语言链表概念 关于c语言链表? c语言链表? c语言 链表是什么,有什么用,它的基本结构是什么 c语言中的链表是什么? C语言链表 C语言中链表 如何C语言创建单链表 C语言里的链表 C语言中有关链表的基础知识 佳能2800出现B500什么处理 佳能腾彩PRO-1彩色喷墨打印机好不好 联想一体机b500硬盘跟普通电脑硬盘一样么? 梦见别人帮洗衣服暗示什么? 听说羊羔毛外套又火了,有知道这种面料的吗? 梦见情人给自己洗衣服 梦见一个女人把屎弄我一身然后我让她给我洗衣服 怎么样才能知道一个服务器的公网IP 我在京东全球购买了点东西,要怎么查物流? 怎么查看服务器IP