c语言程序链表问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语言中链表的问题

#include"stdio.h"
////////////定义的数据//////////////////
typedef struct x

int num;
int age;
char name[20];
int sex :1;
x *next;
DATA;
////////////////////////////////////////
/* 定义的函数 */
//////////////链表的初始化//////////////
DATA *StartList()

DATA *p=new DATA;
p->next=NULL;
p->num=1;
DATA *h=p;
int n;
while(1)

printf("please input data (age,name,sex):");
scanf("%d%s%d",p->age,p->name,p->sex);
p->next=new DATA;
p=p->next;
printf("Do you want to quit this function(Y/N)\n Y is 1,N is 0");
scanf("%d",&n);
if(n==1) break;

return h;

////////////////////////////////////////
////////////////////////////////////////
void main()

StartList();

我做了个链表程序,正处于调试状态,调试StartList,编译器没出错,程序能正常运行,但是中途会报错,你们可以调试一下,出现错误。
请问我的代码出错了吗?哪里出错?

////////////定义的数据//////////////////
typedef struct x

int num;
int age;
char name[20];
int sex :1; //你这是什么东西?
x *next; //你这是什么数据类型?
DATA;
参考技术A p->next=new DATA;
p=p->next;在前面没有新建节点,你这样怎么形成链表呢?你不是始终就只有一个结构吗。
基本链表创建一般是:创建一个节点;用这个把它串上去p->next=new DATA;p=p->next;然后在创建节点,再串上去;追问

.............p->new=new DATA是开辟了DATA数据的新空间,你这还不清楚吗,p=p->new把p指向那个空间,之后循环重复开辟空间,和MALLOC这样开辟空间差不多

追答

孤陋寡闻了 没听说过 也没用过 不好意思啊

参考技术B 具体会出什么错啊,下面是看到的几个问题。
#include"stdio.h"
////////////定义的数据//////////////////
typedef struct x

int num;
int age;
char name[20];
int sex :1;
x *next;
DATA;
////////////////////////////////////////
/* 定义的函数 */
//////////////链表的初始化//////////////
DATA *StartList()

DATA *p=new DATA;
p->next=NULL;
p->num=1;
DATA *h=p;
int n;
while(1)

printf("please input data (age,name,sex):");
scanf("%d%s%d",p->age,p->name,p->sex);
//上句建议修改成scanf("%d,%d,%s",p->age,p->sex,p->name);
//这里一直未对num进行操作
p->next=new DATA; //最后一次申请的结构没有初始化,其中的next为野指针
p=p->next;
printf("Do you want to quit this function(Y/N)\n Y is 1,N is 0");
scanf("%d",&n);
if(n==1) break;

return h;
//链表结尾访问会出问题:你无法判断它是否是链表之尾,顺着next下去会乱
////////////////////////////////////////
////////////////////////////////////////
void main()

StartList();
追问

那你认为该怎么个修改法

追答

DATA *StartList()

DATA *p=new DATA;
DATA *pLast; // =====================================================
pLast=p; // =====================================================
p->next=NULL;
p->num=0;
DATA *h=p;
int n;
while ( 1 )

printf("please input data (age,name,sex):");
scanf("%d,%d,%s",p->age,p->sex,p->name); // ===========================
p->num=pLast->num+1; // 记录序号====================================
pLast=p; // =======================================================
p->next=new DATA;
p=p->next;
printf("Do you want to quit this function(Y/N)\n Y is 1,N is 0");
scanf("%d",&n);
if ( n==1 ) pLast->next=NULL; delete p; break; // =======================

return h;

以后访问链表时发现p->next==NULL时表示链表访问完毕。

以上是关于c语言程序链表问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言程序链表问题

c语言 链表问题~~~

c语言链表问题

c语言中链表的问题

C语言两个链表连接简单问题

C语言链表问题。。【在线等】【急】