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

用C语言编写一个完整的实现单链表(带头结点)的基本操作(包括查找、插入,删除,合并等)的程序,谢谢了,

发布网友 发布时间:2022-05-26 14:16

我来回答

2个回答

热心网友 时间:2023-10-21 13:06

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

typedef struct Node
{
int data;
struct Node * pNext;
} NODE, *PNODE;

PNODE creat_list(void);//创建链表
void travser_list(PNODE pHead);//遍历链表
void add_list(PNODE pHead, int val);//追加链表
bool empty_list(PNODE pHead);//判断链表是否为空
bool insert_list(PNODE pHead, int pos, int val);//插入链表节点
bool delete_list(PNODE pHead, int pos, int *pVal);//删除链表节点
int length_list(PNODE pHead);//求链表长度
bool find_list(PNODE pHead, int pos, int *pVal);//查找链表
void inversion_list(PNODE pHead);//倒置链表
void sort_list(PNODE pHead);//排序链表
void clear_list(PNODE pHead);//清空链表

int main (void)
{
int val;
int len;
PNODE pHead = NULL;
pHead = creat_list();
travser_list(pHead);
add_list(pHead, 78);
add_list(pHead, 45);
add_list(pHead, 0);
add_list(pHead, 17);
travser_list(pHead);
insert_list(pHead, 3, -12);
travser_list(pHead);
if (delete_list(pHead, 4, &val))
{
printf("删除节点成功!删除的值为:%d\n", val);
}
else
printf("删除失败!");
travser_list(pHead);
len = length_list(pHead);
printf("链表的长度为:%d\n", len);
if (find_list(pHead, 10, &val))
{
printf("查找成功!查找的值为:%d\n", val);
}
else
{
printf("查找失败!查找节点不存在!\n");
}
inversion_list(pHead);
travser_list(pHead);
sort_list(pHead);
travser_list(pHead);
printf("下面是清除后的链表!");
clear_list(pHead);
travser_list(pHead);

return 0;
}

PNODE creat_list(void)
{
PNODE pHead;
int num;
int i;
int val;
pHead = (PNODE)malloc(sizeof(NODE));
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)
{
printf("动态内存分配失败!");
exit(-1);
}
printf("请给第%d个节点赋值:", i+1);
scanf("%d", &val);

pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}

return pHead;
}

void travser_list(PNODE pHead)
{
PNODE p = pHead;

while (NULL != p->pNext)
{
p = p->pNext;
printf("%4d", p->data);
}
printf("\n");

return;
}

void add_list(PNODE pHead, int val)
{
PNODE p = pHead;

while (NULL != p->pNext)
{
p = p->pNext;
}

PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态内存分配失败!");
exit(-1);
}
pNew->data = val;
p->pNext = pNew;
pNew->pNext = NULL;
p = pNew;
}

bool empty_list(PNODE pHead)
{
if (NULL == pHead->pNext)
return true;

return false;
}

bool insert_list(PNODE pHead, int pos, int val)
{
PNODE p = pHead;
int i = 0;

while(NULL != p && i < pos -1)
{
p = p->pNext;
i++;
}
if (NULL == p || i > pos-1)
return false;

PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态内存分配失败!");
exit(-1);
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;

return true;
}

bool delete_list(PNODE pHead, int pos, int *pVal)
{
PNODE p = pHead;
int i = 0;

while (NULL != p->pNext && i < pos-1)
{
p = p->pNext;
i++;
}
if (NULL == p->pNext || i > pos-1)
return false;
PNODE r = p->pNext;
*pVal = r->data;
p->pNext = r->pNext;
free(r);
r = NULL;

return true;
}

int length_list(PNODE pHead)
{
int length = 0;
PNODE p = pHead;
while (NULL != p->pNext)
{
p = p->pNext;
length++;
}
printf("\n");

return length;
}

bool find_list(PNODE pHead, int pos, int *pVal)
{
PNODE p = pHead;
int i = 0;

while (NULL != p->pNext && i < pos-1)
{
p = p->pNext;
++i;
}
if (NULL == p->pNext || i > pos-1)
return false;
*pVal = p->pNext->data;

return true;
}

void inversion_list(PNODE pHead)
{
int len;
len = length_list(pHead);
int i, j, t;
PNODE p = pHead;
PNODE q ;

for (i = 0; i < len; ++i)
{
p = p->pNext;
q = p;
for (j = i; j < len - i-1; ++j)
{
q = q->pNext;
}
t = p->data;
p->data = q->data;
q->data = t;
}
printf("\n");

return;
}

void sort_list(PNODE pHead)
{
int len;
len = length_list(pHead);
int i, j, t;
PNODE p = pHead;
PNODE q;

for (i = 0; i < len; ++i)
{
p = p->pNext;
q = p;
for (j = i; j < len-1; ++j)
{
q = q->pNext;
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
printf("\n");

return;
}

void clear_list(PNODE pHead)
{
PNODE p = pHead;
PNODE r ;
int i;
int len = length_list(pHead);
for (i = 0; i < len; ++i)
{
r = p;
r = r->pNext;
p->pNext = r->pNext;
free(r);
}
r = NULL;

return;
}

热心网友 时间:2023-10-21 13:06

typedef struct node
{
 char name[20];
 struct node *link;
}stud;
  这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。

  定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为null。

  下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。

#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define n 10 /*n为人数*/
typedef struct node
{
 char name[20];
 struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
 stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
 int i; /*计数器*/
 if((h=(stud *)malloc(sizeof(stud)))==null) /*分配空间并检测*/
 {
  printf(\"不能分配内存空间!\");
  exit(0);
 }
 h->name[0]=\'\\0\'; /*把表头结点的数据域置空*/
 h->link=null; /*把表头结点的链域置空*/
 p=h; /*p指向表头结点*/
 for(i=0;i<n;i++)
 {
  if((s= (stud *) malloc(sizeof(stud)))==null) /*分配新存储空间并检测*/
  {
   printf(\"不能分配内存空间!\");
   exit(0);
  }
  p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
  printf(\"请输入第%d个人的姓名\",i+1);
  scanf(\"%s\",s->name); /*在当前结点s的数据域中存储姓名*/
  s->link=null;
  p=s;
 }
 return(h);
}
main()
{
 int number; /*保存人数的变量*/
 stud *head; /*head是保存单链表的表头结点地址的指针*/
 number=n;
 head=creat(number); /*把所新建的单链表表头地址赋给head*/
}
  这样就写好了一个可以建立包含n个人姓名的单链表了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
用c语言调用实现带头结点的单链表的建立,插入,删除,查找的源代码

直接插入。小于的话,移动有序表后插入 int j= i-1; int x = a[i]; //复制为哨兵,即存储待排序元素 a[i] = a[i-1]; //先后移一个元素 while(x &lt; a[j]){ //查找在有序表的插入位置 a[j+1] = a[j]; j--; //元素后移 } ...

c语言 链表操作:建立,显示及节点的插入,删除

L-&gt;next = NULL; // 先建立一个带头结点的单链表 for (i=n; i&gt;0; --i){ p = (LinkList)malloc(sizeof(LNode)); // 生成新结点 p-&gt;data = rand()%200; // 改为一个随机生成的数字(200以内)p-&gt;next = L-&gt;next;L-&gt;next = p; // 插入到表头 } } // Create...

...带头结点的单链表,实现单链表上的插入,删除计数,查找,修改,输出等...

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值 */ Status GetElem(LinkList L,int i,ElemType *e){ int j;LinkList p; /* 声明一结点p */ p = L-&gt;next; /* 让p指向链表L的第一个结点 */ j = 1; /* j为计数...

怎样编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操...

typedef int Elemtype;typedef int status;define OVERFLOW -2 define OK 1 define ERROR -1 include "stdio.h"include "stdlib.h"typedef struct LNode { Elemtype data;struct LNode *next;}*linklist;//构造链表 void Create_Linklist(linklist &amp;L){ linklist p;p=(linklist)malloc(sizeo...

数据结构代码(用C语言) 单链表的插入和删除

//单链表测长 void length(Node *head){ Node *p = head-&gt;pstnext;int j=0;while(NULL != p){ p = p-&gt;pstnext;j++;} printf("%d\r\n", j);} //链表按值查找 void research_Date(Node *head, int date){ Node *p;int n=1;p = head-&gt;pstnext;while(NULL != p &amp;&amp; date...

...C语言)中实现有序链表的插入,删除结点基本操作,及两个有序链表的...

int n=0; // n为全局变量,用于统计结点的个数void creat(); //建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入void del(); //用于删除结点,用于参赛选手的删除void search(); //参赛选手成绩的查询void print(); //用于输出链表void rank(); //按个人平均成绩从高到低的顺序...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找

j++;} return p;} /*单链表的按值查找*/ LinkList LocalElem(LinkList la,int e){ LNode* p=la-&gt;next;while(p!=NULL &amp;&amp; p-&gt;data!=e)p=p-&gt;next;return p;} /*单链表插入操作*/ bool InsertList(LinkList la,int i,int e){ //在la链表中的i位置插入数值e int j=1;...

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...

1、数据域:用来存储本身数据 2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。例:typedef strUCt node { char name[20];struct node *link;}stud;这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继...

1、编程实现单链表的建立、插入、删除和查找算法,语言采用C或JAVA等...

void hhead_creat()/*用头插法建立带头结点的单链表*/ {int x;linklist *p;head=(struct node*)malloc(LEN);head-&gt;data=-999;head-&gt;next=NULL;printf("\n\n\t\t请随机输入一组正整数以0作为结束符:\n\n\t\t");scanf("%d",&amp;x);while(x!=0){ p=(struct node*)malloc(LEN);p...

...实现单链表的基本运算 要求是:依次用头插法插入a、b、c、d、e元 ...

并使L指向此头节点 */if(!*L) /* 内存分配失败 */exit (OVERFLOW);(*L)-&gt;next = NULL; /* 指针域为空 */}/* 单链表指定位置插入新元素 *//* 操作结果:在带头结点的单链表L中第1个位置之前插入元素e */status listInsertNode (linkList L, elemType e) {int j=0;linkList p=L,...

c语言实现单链表的查找 用c语言怎么创建一个单链表 编写算法实现单链表的就地逆置 单链表的c语言实现 C语言单链表编写电话簿 c语言单链表的排序 c语言创建一个单链表 c语言单链表程序代码 单链表逆序打印C语言
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...时对方听不到我说话,但是微信按住发语音功能又是好的。是什么... ...2)、(7,4),一辆汽车在x轴上行驶,从原点O出发. 5人团伙盗窃多起价值3万判多久? 已知A、B两村庄的坐标分别为(2,2)、(7,4),一辆汽车在x轴上行驶,从原点... ...2)、(7,4),一辆汽车在x轴上行驶,从原点O出发.(1)汽车行 ...1)和(6,3),一辆汽车从原点O出发,沿x轴向右行驶.(1)当 ...他有上海市的工作签证,现在与原企业解除劳动合同,来我们公司,如何办 ... 湖南凤凰古城需要门票吗 光影魔术手怎样设置图片格式 ...2)、(7,4),一辆汽车在轴上行驶,从原点O出发。(1)汽车行驶 c语言用单链表基本操作实现 vivo手机怎么登两个? 教师资格考试面试考什么 vivo手机怎么登录两个 跪求,2015湖南教师资格证国考报考条件? 集装箱尺寸相关 电脑cpu上面的风扇要不要涂硅胶? 80 psi的压力是多少 散热风扇,硅胶??? 支付宝企业账号风险等级过高,重新注册的话还可以用原来的邮箱号吗? 谁有拷打视频的网站?不要KU6的,要别的哦 企业支付宝邮箱要新建吗? 描写人物的作文 人物特点显著 短一些 5吨的自卸车可以装多少立方的土方。 5吨的货车可以装多少立方的竹屑? 瞬间的他,描写人物性格比较鲜明的作文 一般标准的准载5吨货车一次可以拉多少立方的泥土? 5吨装载机的标准铲斗是多少立方?6吨到8吨的呢? 五吨水蒸气等于多少立方米?? 小学生积极分子主要表现事迹怎么写 vivo手机怎样开两个? 单链表的基本操作操作,类C语言 C语言数据结构链表的基本操作 c语言中关于链表的基本操作问题 铁岭市银州区郊区哪有野菜? 2022鞍山去哪挖野菜 好多人挖野菜在昌平哪儿挖啊 excel如何根据列,生成这样的图表? 北京哪些学校有演艺(演员)专业的? 北京都有哪些能当上演员或者歌手的学校? 能当演员的大学有哪些? 北京有什么好大学? 我想以后当演员,在北京上,不用担心分数线,只说有什么大学有演艺系。 赣榆摩托车驾照在哪报名 我是连云港的,请问考了C1照后多久能增驾魔托车驾驶证?在赣榆考一个摩托车驾证和挂个牌照加在一起要多钱 连云港赣榆县考摩托车驾照需要什么东西带多少钱 赣榆县办理摩托车驾驶证要多少钱 赣榆摩托车驾驶证办理多少钱 赣榆摩托车驾照好考吗 连云港办理摩托车驾驶证在哪里啊? 连云港市摩托车驾驶证到那里学习