c语言 链表问题~~~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 链表问题~~~相关的知识,希望对你有一定的参考价值。

删除链表中的一个节点,输入n删除第n个。
#include<stdio.h>
#include<malloc.h>
int n;
struct student

int number;
char name[10];
struct student *next;
;

struct student *Create_List();
struct student *del(struct student *head,int num);
void Print_List(struct student *head);

void main()

int num;
struct student *head;
head=Create_List();
Print_List(head);

scanf("%d",&num);
head=del(head,num);

Print_List(head);



struct student *Create_List()


struct student *head=NULL,*p1,*p2;
int n=0;

p1=(struct student *)malloc(sizeof(struct student));

if(p1==NULL)

printf("内存分配失败");
return NULL;


scanf("%d,%s",&p1->number,&p1->name);

while(p1->number!=0)

n++;

if(n==1)
head=p1;
else
p2->next=p1;

p2=p1;
p1=(struct student *)malloc(sizeof(struct student));

scanf("%d,%s",&p1->number,&p1->name);


p2->next=NULL;

free(p1);
p1=NULL;

return(head);


void Print_List(struct student *head)

struct student *p;
p=head;

if(head!=NULL)
do

printf("%d,%s\n",p->number,p->name);
p=p->next;
while(p!=NULL);


struct student *del(struct student *head,int num)

struct student *p1,*p2;
p1=head;

if(head==NULL)
printf("空");

if(p1->number!=num)


do

p2=p1;
p1=p1->next;
if(p1==NULL)

printf("没");
break;

while(p1->number!=n);

if(p1->number==num)

p2=p1->next;
p1=p1->next;
n=n-1;

do

p2=p1;
p1=p1->next;
while(p1!=NULL);


return(head);

最后个定义的函数错哪了?

我也在写关于链表的一个题 也有删除的 你看下用我的行不行

# include <iostream>
# include "stdlib.h"
# include <string.h>

using namespace std;

# define NULL 0

typedef struct list

bool Flag;
char* data;
struct list* next;
list,*LIST;

LIST create()
//创建链表
LIST p;
p=(LIST)malloc(sizeof(list));
p->data=NULL;
return p;


void insert(LIST& head,char* str,bool Flag )
//把元素插入链表
LIST p;
p=(LIST)malloc(sizeof(list));
p->next=head;
p->data = (char *)malloc(sizeof(char)*15);
p->data = str;
head=p;
p->Flag=Flag;


void Delete(LIST& head,char* str)
//删除链表元素
LIST p,q;
p=head;
if(head==NULL)
cout<<"list NULL,erro\n";
else
for(;p->data!=str&&p->next!=NULL;p=p->next)
q=p;
if(p->next==NULL&&p->data!=str)
cout<<str<<" is not in the list\n";
else if(p->data==str)
if(p!=head)
q->next=p->next;
else
head=head->next;

delete p;


void SORT(LIST& head)
//链表排序
LIST p,q,s;
char* a=(char *)malloc(sizeof(char)*15);
if(head==NULL)
cout<<"list is NULL,you have no need to sort it\n";
else

for(p=head;p->data!=NULL;p=p->next)

for(q=p->next;q->data!=NULL;q=q->next)

if(p->Flag>q->Flag)

a=p->data;
p->data=q->data;
q->data=a;
p->Flag=0;
q->Flag=1;



for(p=head;p->data!=NULL;p=p->next)

for(q=p->next;q->data!=NULL;q=q->next)

if(p->Flag==q->Flag&&strcmp(p->data,q->data)>0)

a=p->data;
p->data=q->data;
q->data=a;




// delete a;


void print(LIST head)
//输出链表
LIST p;
p=head;
if(head==NULL)
cout<<"list NULL,quit\n";
else

cout<<"\nhere is the list\n";
for(;p->data!=NULL;p=p->next)
cout<<p->data<<'\t'<<p->Flag<<endl;
cout<<endl;


int main()

char str[15] = "12345678901234";
char str1[15] = "bbcd";
char str2[15] = "cbcd";
char str3[15] = "abgd";
char str4[15] = "babgd";
char str5[15] = "adwd";
char str6[15] = "cswd";
char str7[15] = "bdewgd";
LIST head=create();
insert(head,str ,0);
insert(head,str1,1);
insert(head,str2,0);
insert(head,str3,0);
insert(head,str4,1);
insert(head,str5,0);
insert(head,str6,0);
insert(head,str7,1);
print(head);
Delete(head,str);
SORT(head);
print(head);

return 0;
参考技术A 没分,还这么长,不看
我刚运行了一下看了看,你最后面好像是少了一个大括号,其他的没注意

c语言链表问题,有点抽象。

照着书本打了段代码,不知道哪里出错就是运行不了,代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student

char name[10];
int num;
struct student *next;
*head,*p1,*p2,*p;
int n=0;
void main ()

creat();
shuchu();


void creat()

p1=(struct student *)malloc(sizeof(struct student));
p2=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);
while(p1->name!=0)

n+=1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);




void shuchu()

p=head;
while(p!=NULL)

printf("%s,%d",p->name,p->num);
p=p->next;




我用的是vs2012,错误提示如下:

1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(13): warning C4013: “creat”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(14): warning C4013: “shuchu”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(18): error C2371: “creat”: 重定义;不同的基类型
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(41): error C2371: “shuchu”: 重定义;不同的基类型
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

还有许多链表的问题,我上面那个代码的那个if的else部分是啥意思。
最好每行都注释一下哈!谢谢!

参考技术A

改成下面这样就可以了

#include <stdio.h>

#include<stdlib.h>

#include<string.h> 

struct student 

 char name[10];

 int num;

 struct student *next;

*head,*p1,*p2,*p;

int n=0;

void creat()

 p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址

 printf("输入姓名\\n");

 scanf("%s",p1->name);

 printf("输入学号\\n");

 scanf("%d",&p1->num); 

 while(p1->num!=0) 

  

  n+=1;

  if(n==1)//第一条记录为头记录

   head=p1;//设置第一条记录为头记录 

  else

   p2->next=p1;//如果不是第一条记录,把next指向上一次循环新建的内存地址

  p2=p1;  

  p1=(struct student *)malloc(sizeof(struct student)); 

  printf("输入姓名\\n"); 

  scanf("%s",p1->name);

  printf("输入学号\\n"); 

  scanf("%d",&p1->num);

  

 p2->next=NULL;//要加上这一句,表示最后一条记录

void shuchu() 

 p=head;

 while(p!=NULL)

  

  printf("%s , %d\\n",p->name,p->num);//加上\\n分行

     p=p->next;

  

void main () 

 

 creat();

 shuchu(); 

 system("pause");//该语句可防止运行结束时退出命令窗口,但多了提示“请按任意键继续...”这样才能看到屏幕内容

 

还有我把这程序完善了,可以到这里下载

追问

p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址
第一个问题:为啥这里要指向同一个地址呢?
第二个问题:代码中出现动态内存分配的函数malloc,为什么不需要用free()函数来释放内存呢?

追答

第一个问题:其实从程序上看,p2相当于是指向链表最后一条记录的指针,p1相当于是临时记录,刚开始当然要指向同一个记录了!
第二个问题:因为你显示结束后,程序也就结束了,编译器会自动收回内存

本回答被提问者和网友采纳

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

c语言 链表问题~~~

c语言链表问题

c语言中链表的问题

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

c语言程序链表问题

C语言链表的问题