C 语言链表问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言链表问题相关的知识,希望对你有一定的参考价值。
请问下大家是怎么解决C语言链表存储多种数据类型这个问题的。C++可以用类模板,C语言要怎么办呢.不要具体代码我,只想听听大家的想法。小白求赐教。
是
//*CHAPTER :2 (2_2) *
//*PROGRAM :链式结构的线性表 *
//*CONTENT :生成,插入,删除,定位,查找 *
//* * * * * * * * * * * * * * * * * * * * * * * *
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct node) //定义LEN为一个节点的长度
enum BOOLFalse,True; //定义BOOL型
typedef struct node
char data; //数据域
struct node *next;//指向下一个节点的指针
*LinkList;
void CreatList(LinkList &,int); //生成一个单链表
BOOL ListInsert(LinkList &,int,char); //在单链表中插入一个元素
BOOL ListDelete(LinkList &,int,char &); //在单链表中删除一个元素
BOOL ListFind_keyword(LinkList,char,int &); //按关键字查找一个元素
BOOL ListFind_order(LinkList,char &,int); //按序号查找一个元素
void ListPrint(LinkList); //显示单链表所有元素
int main()
LinkList L;
BOOL temp;
int num,loc,flag=1;
char j,ch;
//textbackground(3); //设置屏幕颜色
// textcolor(15);
// clrscr();
//---------------------程序解说-----------------------
printf("本程序实现链式结构的线性表的操作。\n");
printf("可以进行插入,删除,定位,查找等操作。\n");
//----------------------------------------------------
printf("请输入初始时链表长度:"); //输入生成单链表时的元素个数
scanf("%d",&num);
CreatList(L,num); //生成单链表
ListPrint(L);
while(flag)
printf("请选择:\n");
printf("1.显示所有元素\n"); //显示链表元素
printf("2.插入一个元素\n"); //插入链表元素
printf("3.删除一个元素\n"); //删除链表元素
printf("4.按关键字查找元素\n"); //按关键字查找
printf("5.按序号查找元素\n"); //按序号查找
printf("6.退出程序 \n"); //退出
scanf(" %c",&j);
switch(j)
case '1':ListPrint(L); break;
case '2':printf("请输入元素(一个字符)和要插入的位置:\n");
printf("格式:字符,位置;例如:a,3\n");
scanf(" %c,%d",&ch,&loc); //输入要插入的元素和要插入的位置
temp=ListInsert(L,loc,ch); //插入
if(temp==False) printf("插入失败!\n"); //插入失败
else printf("插入成功!\n"); //成功插入
ListPrint(L);
break;
case '3':printf("请输入要删除的元素所在位置:");
scanf("%d",&loc); //输入要删除的节点的位置
temp=ListDelete(L,loc,ch); //删除
if(temp==False) printf("删除失败!\n"); //删除失败
else printf("成功删除了一个元素:%c\n",ch); //删除成功,显示该元素
ListPrint(L);
break;
case '4':if(L->next==NULL) //链表为空
printf("链表为空!\n");
elseprintf("请输入要查找的元素(一个字符):");
scanf(" %c",&ch); //输入要查找的元素
temp=ListFind_keyword(L,ch,loc); //按关键字查找
if(temp==False) printf("没有找到该元素!\n"); //查找失败
else printf("该元素在链表的第%d个位置。\n",loc);
//成功查找,显示该元素位置
break;
case '5':if(L->next==NULL) //链表为空
printf("链表为空!\n");
elseprintf("请输入要查找的位置:");
scanf("%d",&loc); //输入要查找的元素的位置
temp=ListFind_order(L,ch,loc); //按序号查找
if(temp==False) printf("该位置不存在!\n"); //查找失败
else printf("第%d个元素是:%c\n",loc,ch);
//成功查找,显示该元素
break;
default:flag=0;printf("程序结束,按任意键退出!\n");
getch();
return 0;
void CreatList(LinkList &v,int n)
//生成一个带头结点的有n个元素的单链表
int i;
LinkList p;
v=(LinkList)malloc(LEN); //生成头结点
v->next=NULL;
printf("请输入%d个字符:例如:abcdefg\n",n);
getchar();
for(i=n;i>0;--i)
p=(LinkList)malloc(LEN); //生成新结点
scanf("%c",&p->data);
p->next=v->next;
v->next=p;
BOOL ListInsert(LinkList &v,int i,char e)
//在单链表的第i各位置插入元素e,成功返回True,失败返回False
LinkList p,s;
int j=0;
p=v;
while(p&&j<i-1) p=p->next;++j; //查找第i-1个元素的位置
if(!p||j>i-1) return False; //没有找到
s=(LinkList)malloc(LEN); //生成一个新结点
s->data=e;
s->next=p->next; //将新结点插入到单链表中
p->next=s;
return True;
BOOL ListDelete(LinkList &v,int i,char &e)
//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False
LinkList p,q;
int j=0;
p=v;
while(p->next&&j<i-1) //查找第i-1个元素位置
p=p->next;++j;
if(!(p->next)||j>i-1) return False; //查找失败
q=p->next;p->next=q->next; //删除该元素
e=q->data; //e取得该元素值
free(q); //释放该元素空间
return True;
BOOL ListFind_keyword(LinkList v,char e,int &i)
//在单链表中查找关键字为e的元素,成功返回True,并用i返回该元素位置,
//失败返回False
i=1;
LinkList p;
p=v->next;
while((p->data!=e)&&(p->next!=NULL))//p指针指向下一个,直到
p=p->next; i++; //找到或到链表尾为止
if(p->data!=e) //该元素在链表中不存在
return False;
else return True;
BOOL ListFind_order(LinkList v,char &e,int i)
//在单链表中查找第i个元素,成功返回True,并用e返回该元素值,
//失败返回False
LinkList p;
int j=0;
p=v;
while(p->next&&j<i) //移动指针,直到找到第i个元素
p=p->next;++j;
if(j!=i) return False; //查找失败
else e=p->data; //查找成功,用e取得该元素值
return True;
void ListPrint(LinkList v)
//显示链表所有元素
LinkList q;
q=v->next;
printf("链表所有元素:");
while(q!=NULL)
printf("%c ",q->data);q=q->next;
printf("\n");
代码都不想看 就别学编程了 参考技术A 结构体啊,定义一个struct
可以直接用struct <结构体名> int ; char ; ……变量名列表
也可以用typedef struct <结构体名> 成员列表 想设置的类型(用来直接定义变量) 参考技术B 我觉得可以用空指针啊,然后类型转换。本回答被提问者采纳 参考技术C 不解释,宏定义的使用。楼主,一语中的,有木有!
c语言程序链表问题
分别建立两个有3个元素结点的单链表(无头结点),然后对两个链表进行各自排序(显示排序后的链表),最后采用首尾相连方式合并两个单链表,显示合并后的单链表。
样例输入
4 6 5
9 7 8
样例输出
4 5 6
7 8 9
4 5 6 7 8 9
虽然题目一个链表只要3元素,但我不想把代码写死,修改常量可实现任意长度链表。
另外你强调不能用头结点,所以我用指向首节点的指针。(头结点只是方便定位链表,和首节点指针其实意义相同,否则你去哪找之前创建好的链表)
#include <stdio.h>#include <malloc.h>
#define LN 3//最大链表元素数量,这里题目只要3个
typedef struct list
int num;
struct list *next;
LIST;
LIST * creatList();
LIST *px(LIST *listP);
void printfLIST(LIST *listP);
LIST *cLists(LIST *listP1,LIST *listP2);
int main()
LIST *listP1=NULL,*listP2=NULL;
printf("输入:\\n");
listP1=creatList();
px(listP1);
listP2=creatList();
px(listP2);
printf("输出:\\n");
printfLIST(listP1);
printfLIST(listP2);
printfLIST(cLists(listP1,listP2));
return 0;
void printfLIST(LIST *listP)//打印链表
while(listP)
printf("%d ",listP->num);
if(listP->next==NULL)
break;
listP=listP->next;
printf("\\n");
LIST * creatList()//输入创建单链表,返回首节点指针
int i=LN;
LIST *listP=NULL,*listTail=NULL;
while(i-->0)
LIST *listNew=(LIST *)malloc(sizeof(LIST));
listNew->next=NULL;
scanf("%d",&listNew->num);
if(listP==NULL)
listP=listNew;
else
listTail->next=listNew;
listTail=listNew;
return listP;
LIST *px(LIST *listP)//排序,返回首节点指针
LIST * listf=listP,*listn=NULL;
while(listf)
listn=listf->next;
while(listn)
if(listf->num>listn->num)
listf->num^=listn->num,listn->num^=listf->num,listf->num^=listn->num;
if(listn->next==NULL)
break;
listn=listn->next;
if(listf->next==NULL)
break;
listf=listf->next;
return listP;
LIST *cLists(LIST *listP1,LIST *listP2)//连接两个链表,返回首节点指针
LIST *listP3=listP1;
while(listP1)
if(listP1->next==NULL)
break;
listP1=listP1->next;
listP1->next=listP2;
return listP3;
参考技术A 操作系统 win 8.1// 编译环境 Visual Stuido 2017#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义 // 链表节点的定义typedef struct ListNode
ElementType Element; // 数据域,存放数据
ListNode* Next; // 指向下一个链表节点Node, *PNode;// 链表创建函数定义PNode CreateList(void) int len ; // 用于定义链表长度
int val ; // 用于存放节点数值
PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间
//头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点)
if (PHead == NULL) // 判断是否分配成功
printf("空间分配失败 \n");
exit(-1);
PNode PTail = PHead; // 链表的末尾节点,初始指向头节点
PTail->Next = NULL; // 最后一个节点指针置为空
printf("请输入节点个数:");
scanf_s("%d", &len); // 输入节点个数
for (int i = 0; i < len; i++)
PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一个新节点
if (pNew == NULL)
printf("分配新节点失败\n");
exit(-1);
printf("请输入第 %d 个节点的数据:", i + 1);
scanf_s("%d", &val); // 输入链表节点的数据
pNew->Element = val; // 把数据赋值给节点数据域
PTail->Next = pNew; // 末尾节点指针指向下一个新节点
pNew->Next = NULL; // 新节点指针指向为空
PTail = pNew; // 将新节点复制给末尾节点
printf("创建链表成功\n"); return PHead; // 返回头节点// 主函数 int main()
PNode List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
return 0;
参考技术B 你的这个要求不会有人答应的。因为:(1)、你的这个题目难度很大,首先从程序的编程难度和规模上讲,比老师留的一个 C 语言大作业还大,更何况在你的要求中还涉及到了 C 语言的最精华、同时也是最、最难于调试的程序代码:指针!!因为指针在 C 语言中是一个极其重要、且非常抽象的概念,况且如果再将涉及到的指针的相关知识,应用于建立、删除、排序各种链表(即:单链表一个指针变量、或者是:双链表两个指针变量)、并且调试通过这类的源代码,那就更是难上加难的事情!
(2)、此外必须要知道:编写任何一个高级语言源程序,要想从编程、编译、调试、直到最后运行出正确的结果,那是必须要有一个上机编程环境,且经过亲自上机调试,而不是靠在纸上写完程序,就一定能够保证程序运行出正确结果的。
以上是关于C 语言链表问题的主要内容,如果未能解决你的问题,请参考以下文章