求C语言 数据结构中的链表创建,插入和删除代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C语言 数据结构中的链表创建,插入和删除代码相关的知识,希望对你有一定的参考价值。

急求一段能运行,能编译(没一点错误,不然还要我找错误)的程序,能在c上运行的,简短的就行,只要包含了链表的创建,插入和删除就行。不用太长,越简短越好,附上注释,谢谢。比如学生成绩的输入,插入类似的问题。

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

#define COURSE_NUM 5 /* 最多的考试科目 */

struct student

int number; /* 每个学生的学号 */
char name[15]; /* 每个学生的姓名 */
int score[COURSE_NUM]; /* 每个学生M门功课的成绩 */
int sum; /* 每个学生的总成绩 */
float average; /* 每个学生的平均成绩 */
struct student *next;
;
typedef struct student STU;
STU *head=NULL;
char Menu(void);
int Ascending(int a, int b);
int Descending(int a, int b);
void IntSwap(int *pt1, int *pt2);
void CharSwap(char *pt1, char *pt2);
void FloatSwap(float *pt1, float *pt2);

STU *DeleteNode(STU *head, int nodeNum);
STU *ModifyNode(STU *head, int nodeNum, const int m);
STU *SearchNode(STU *head, int nodeNum);
STU *AppendScore(STU *head, const int m);
void TotalScore(STU *head, const int m);
void PrintScore(STU *head, const int m);
STU *DeleteScore(STU *head, const int m);
void ModifyScore(STU *head, const int m);
void SortScore(STU *head, const int m, int (*compare)(int a, int b));
void SearchScore(STU *head, const int m);
void DeleteMemory(STU *head);
void InputNodeData(STU *pNew, int m);
STU *AppendNode(STU *head, STU **pNew);
void saveandfree( );
void open();
void main()

char ch;
int m;

STU *head = NULL;

system("COLOR e4");
open();
printf("请输入学生数量(m<10):");
scanf("%d", &m);
while (1)

ch = Menu(); /* 显示菜单,并读取用户输入 */
switch (ch)

case'1':head = AppendScore(head, m); /* 调用成绩输入模块 */
TotalScore(head, m);
break;
case'2':PrintScore(head, m); /* 调用成绩显示模块 */
break;
case'3':head = DeleteScore(head, m); /* 调用成绩删除模块 */
printf("\nAfter deleted\n");
PrintScore(head, m); /* 显示成绩删除结果 */
break;
case'4':ModifyScore(head, m); /* 调用成绩修改模块 */
TotalScore(head, m);
printf("\nAfter modified\n");
PrintScore(head, m); /* 显示成绩修改结果 */
break;
case'5':SearchScore(head, m); /* 调用按学号查找模块 */
break;
case'6':SortScore(head, m, Descending); /* 按总分降序排序 */
printf("\nsorted in descending order by sum\n");
PrintScore(head, m); /* 显示成绩排序结果 */
break;
case'7':SortScore(head, m, Ascending); /* 按总分升序排序 */
printf("\nsorted in ascending order by sum\n");
PrintScore(head, m); /* 显示成绩排序结果 */
break;
case'0':exit(0); /* 退出程序 */
DeleteMemory(head); /*释放所有已分配的内存*/
printf("End of program!");
saveandfree();
break;
default:printf("Input error!");
break;




/* 函数功能:显示菜单并获得用户键盘输入的选项
函数参数:无
函数返回值:用户输入的选项
*/
char Menu(void)

char ch;

printf("\n学生成绩管理系统\n");
printf(" 1.添加某个学生记录\n");
printf(" 2.输出全部学生记录\n");
printf(" 3.删除一个学生记录\n");
printf(" 4.修改一个学生记录\n");
printf(" 5.搜索学生记录\n");
printf(" 6.按总分降序排序\n");
printf(" 7.按总分升序排序\n");
printf(" 0.退出学生记录系统\n");
printf("请选择:");
scanf(" %c", &ch); /*在%c前面加一个空格,将存于缓冲区中的回车符读入*/
return ch;


/* 函数功能:删除一个指定学号的学生的记录
函数参数:结构体指针head,指向存储学生信息的链表的首地址
整型变量m,表示考试科目
函数返回值:删除学生记录后的链表的头指针
*/
STU *DeleteScore(STU *head, const int m)

int i = 0, nodeNum;
char c;

do
printf("请输入你想要删除的同学的学号:");
scanf("%d", &nodeNum);
head = DeleteNode(head, nodeNum); /*删除学号为nodeNum的学生信息*/
PrintScore(head, m); /*显示当前链表中的各节点信息*/
printf("你真的想删除记录吗(Y/N)?");
scanf(" %c",&c); /*%c前面有一个空格*/
i++;
while (c=='Y' || c=='y');
printf("%d 的记录已删除\n", i);
return head;


/* 函数功能:修改一个指定学号的学生的记录
函数参数:结构体指针head,指向存储学生信息的链表的首地址
整型变量m,表示考试科目
函数返回值:修改学生记录后的链表的头指针
*/
void ModifyScore(STU *head, const int m)

int i = 0, nodeNum;
char c;

do
printf("请输入你想要修改的学生的学号:");
scanf("%d", &nodeNum);
head = ModifyNode(head, nodeNum, m); /*修改学号为nodeNum的节点*/
printf("你真的想修改此位同学的记录吗(Y/N)?");
scanf(" %c",&c); /*%c前面有一个空格*/
i++;
while (c=='Y' || c=='y');
printf("%d 的记录已修改!\n", i);


/* 函数功能:计算每个学生的m门功课的总成绩和平均成绩
函数参数:结构体指针head,指向存储学生信息的链表的首地址
整型变量m,表示考试科目
函数返回值:无
*/
void TotalScore(STU *head, const int m)

STU *p = head;
int i;

while (p != NULL) /*若不是表尾,则循环*/

p->sum = 0;
for (i=0; i<m; i++)

p->sum += p->score[i];

p->average = (float)p->sum / m;
p = p->next; /*让p指向下一个节点*/



/* 函数功能:用交换法按总成绩由高到低排序
函数参数:结构体指针head,指向存储学生信息的链表的首地址
整型变量m,表示考试科目
函数返回值:无
*/
void SortScore(STU *head, const int m, int (*compare)(int a, int b))

STU *pt;
int flag = 0, i;

do
flag = 0 ;
pt = head;
/*若后一个节点的总成绩比前一个节点的总成绩高,则交换两个节点中的数据
注意只交换节点数据,而节点顺序不变,即节点next指针内容不进行交换*/
while (pt->next != NULL)

if ((*compare)(pt->next->sum, pt->sum))

IntSwap(&pt->number, &pt->next->number);
CharSwap(pt->name, pt->next->name);
for (i=0; i<m; i++)

IntSwap(&pt->score[i], &pt->next->score[i]);

IntSwap(&pt->sum, &pt->next->sum);
FloatSwap(&pt->average, &pt->next->average);

flag = 1;

pt = pt->next;

while(flag);


/*交换两个整型数*/
void IntSwap(int *pt1, int *pt2)

int temp;

temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;


/*交换两个实型数*/
void FloatSwap(float *pt1, float *pt2)

float temp;

temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;


/*交换两个字符串*/
void CharSwap(char *pt1, char *pt2)

char temp[15];

strcpy(temp, pt1);
strcpy(pt1, pt2);
strcpy(pt2, temp);


/*决定数据是否按升序排序,a<b为真,则按升序排序*/
int Ascending(int a, int b)

return a < b;


/* 决定数据是否按降序排序,a>b为真,则按降序排序 */
int Descending(int a, int b)

return a > b;


/* 函数功能:按学号查找学生成绩
函数参数:结构体指针head,指向存储学生信息的链表的首地址
整型变量m,表示考试科目
函数返回值:无
*/
void SearchScore(STU *head, const int m)

int number, i;
STU *findNode;

printf("请输入你想要查找的学生的学号:");
scanf("%d", &number);
findNode = SearchNode(head, number);
if (findNode == NULL)

printf("没有找到!\n");

else

printf("\nNo.%3d%8s", findNode->number, findNode->name);
for (i=0; i<m; i++)

printf("%7d", findNode->score[i]);

printf("%9d%9.2f\n", findNode->sum, findNode->average);



/* 函数的功能:显示所有已经建立好的节点的节点号和该节点中数据项内容
函数的参数:结构体指针变量head,表示链表的头节点指针
整型变量m,表示考试科目
函数返回值:无
*/
void PrintScore(STU *head, const int m)

STU *p = head;
char str[100] = '\0', temp[3];
int i, j = 1;

strcat(str, "Number Name ");
for (i=1; i<=m; i++)

strcat(str, "Score");
itoa(i,temp, 10);
strcat(str, temp);
strcat(str, " ");

strcat(str," sum average");

printf("%s", str); /* 打印表头 */
while (p != NULL) /*若不是表尾,则循环打印*/

printf("\nNo.%3d%15s", p->number, p->name);
for (i=0; i<m; i++)

printf("%7d", p->score[i]);

printf("%9d%9.2f", p->sum, p->average);
p = p->next; /*让p指向下一个节点*/
j++;

printf("\n");


/* 函数功能:按学号查找并修改一个节点数据
函数参数:结构体指针变量head,表示链表的头节点指针
整型变量nodeNum,表示待修改节点的学号
整型变量m,表示考试科目
返回参数:修改节点后的链表的头节点指针
*/
STU *ModifyNode(STU *head, int nodeNum, const int m)

int j;
STU *newNode;

newNode = SearchNode(head, nodeNum);
if (newNode == NULL)

printf("没有找到!\n");

else

printf("输入新的记录:\n");
printf("输入名字:");
scanf("%s", newNode->name);
for (j=0; j<m; j++)

printf("输入分数%d:", j+1);
scanf("%d", newNode->score+j);


return head;


/* 函数功能:从head指向的链表中删除一个节点数据为nodeNum的节点
输入参数:结构体指针变量head,表示原有链表的头节点指针
整型变量nodeNum,表示待删除节点的节点数据值
返回参数:删除节点后的链表的头节点指针
*/
STU *DeleteNode(STU *head, int nodeNum)

STU *p = head, *pr = head;

if (head == NULL) /*链表为空,没有节点,无法删除节点*/

printf("无此节点!\n");
return(head);

/*若没找到节点nodeNum且未到表尾,则继续找*/
while (nodeNum != p->number && p->next != NULL)

pr = p;
p = p->next;

if (nodeNum == p->number) /*若找到节点nodeNum,则删除该节点*/

if (p == head) /*若待删节点为首节点,则让head指向第2个节点*/

head = p->next;

else /*若待删节点非首节点,则将前一节点指针指向当前节点的下一节点*/

pr->next = p->next;


free(p); /*释放为已删除节点分配的内存*/

else /*没有找到待删除节点*/

printf("此节点已被删除!\n");

return head; /*返回删除节点后的链表的头节点指针*/


/* 函数功能:按学号查找一个节点数据
函数参数:结构体指针变量head,表示链表的头节点指针
整型变量nodeNum,表示待修改节点的学号
返回参数:待修改的节点指针
*/
STU *SearchNode(STU *head, int nodeNum)

STU *p = head;
int j = 1;

while (p != NULL) /*若不是表尾,则循环*/

if (p->number == nodeNum) return p;
p = p->next; /*让p指向下一个节点*/
j++;

return NULL;


/* 函数功能:释放head指向的链表中所有节点占用的内存
输入参数:结构体指针变量head,表示链表的头节点指针
返回参数:无
*/
void DeleteMemory(STU *head)

STU *p = head, *pr = NULL;

while (p != NULL) /*若不是表尾,则释放节点占用的内存*/

pr = p; /*在pr中保存当前节点的指针*/
p = p->next; /*让p指向下一个节点*/
free(pr); /*释放pr指向的当前节点占用的内存*/


/* 函数功能:输入一个节点的节点数据
函数参数:结构体指针变量pNew,表示链表新添加节点的指针
整型变量m,表示考试科目
返回参数: 无
*/
void InputNodeData(STU *pNew, int m)

int j;

printf("输入节点信息......");
printf("\n输入学号:");
scanf("%d", &pNew->number);
printf("输入姓名:");
scanf("%s", pNew->name);
for (j=0; j<m; j++)

printf("输入分数%d:", j+1);
scanf("%d", pNew->score+j);



/* 函数功能:新建一个节点,并将该节点添加到链表的末尾
函数入口参数:结构体指针变量head,表示原有链表的头节点指针
函数出口参数:指向结构体指针的指针变量pNew,表示指向新添加节点指针的指针
函数返回值:添加节点后的链表的头节点指针
*/
STU *AppendNode(STU *head, STU **pNew)

STU *p = NULL;
STU *pr = head;

p = (STU *)malloc(sizeof(STU)); /*为新添加的节点申请内存*/
if (p == NULL) /*若申请内存失败,则打印错误信息,退出程序*/

printf("No enough memory to alloc");
exit(0);


if (head == NULL) /*若原链表为空表,则将新建节点置为首节点*/

head = p;

else /*若原链表为非空,则将新建节点添加到表尾*/

/*若未到表尾,则继续移动指针pr,直到pr指向表尾*/
while (pr->next != NULL)

pr = pr->next;

pr->next = p; /*将新建节点添加到链表的末尾*/

pr = p; /*让pr指向新建节点*/
pr->next = NULL; /*将新建节点置为表尾*/
*pNew = p; /*将新建节点指针通过二级指针pNew返回给调用函数*/
return head; /*返回添加节点后的链表的头节点指针*/


/* 函数功能:向链表中添加从键盘输入的学生学号、姓名和成绩等信息
函数参数:结构体指针head,指向存储学生信息的结构体数组的首地址
整型变量m,表示考试科目
函数返回值:无
*/
STU *AppendScore(STU *head, const int m)

int i = 0;
char c;
STU *pNew;

do
head = AppendNode(head, &pNew); /*向链表末尾添加一个节点*/
InputNodeData(pNew, m); /*向新添加的节点中输入节点数据*/
printf("你真的想要添加一个节点(Y/N)?");
scanf(" %c",&c); /*%c前面有一个空格*/
i++;
while (c=='Y' || c=='y');
printf("%d 新的节点已被添加!\n", i);
return head;


/*输出信息到文件 */
void saveandfree( )


STU *p=NULL;
FILE * fp;
int i;
char * file="student.txt";
if(head==NULL)

printf("无记录\n");
return;

else

p=head->next;
if((fp=fopen(file,"w"))==NULL)

printf("\n打不开文件\n");
return;

while(p!=NULL)

fprintf(fp,"%d\t%s\t%d\t%f\t\n",p->number,p->name,p->sum,p->average);
for(i=0;i<COURSE_NUM;i++)
fprintf(fp,"%d\n",p->score[i]);
p=p->next;

printf("保存完毕\n");
fclose(fp);
for(;head->next!=NULL;)

p=head->next;
head->next=head->next->next;
free(p);


free(head);


/*读取文件信息到链表*/
void open()

FILE * fp;
STU *p1=NULL;
STU *p2=NULL;
STU *temp=NULL;
int i ;
if((fp=fopen("E:\\student.txt","r"))==NULL)

printf("\n************这是一个学生管理程序************");
return ;

head=(STU *)malloc(sizeof(struct student));
head->next=NULL;
temp=p2=head;
while(! feof(fp))

p1=(STU *)malloc(sizeof(struct student));
temp=p2;
p2->next=p1;
p2=p1;
fscanf(fp,"%d%s%d%f",p1->number,p1->name,p1->sum,p1->average);
for(i=0;i<COURSE_NUM;i++)
fscanf(fp,"%d",p1->score[i]);

temp->next=NULL;
fclose(fp);
参考技术A #include<stdio.h>
#include<stdlib.h>

typedef struct LNode

int data;
struct LNode *next;
LNode,*Llist;

LNode *creat_head();//创建一个空表
void creat_list(LNode *,int);//创建一个长度为n的线性链表
void insert_list(LNode *,int,int );//插入一个元素
int delete_list(LNode *,int);//删除一个元素
main()

LNode *head,*p;
int n;
int x,i;
int b;
clrscr();
head=creat_head();
printf("n=");scanf("%d",&n);
creat_list(head,n);

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

printf("%d ",p->data);
p=p->next;


printf("\n*****************************************************\n");
printf("x=");scanf("%d",&x);
printf("\ninsert i=");scanf("%d",&i);
insert_list(head,x,i);

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

printf("%d ",p->data);
p=p->next;


printf("\n*********************************************************\n");
printf("delete i=");scanf("%d",&i);

b=delete_list(head,i);

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

printf("%d ",p->data);
p=p->next;


printf("\ndelete b=%d",b);

getch();


//创建一个空链表
LNode *creat_head()

LNode *p;

p=(Llist)malloc(sizeof(LNode));

p->next=NULL;

return(p);


//创建一个长度为n的线性链表
void creat_list(LNode *head,int n)

LNode *p,*q;
int i;
p=head;

for(i=1;i<=n;i++)

q=(Llist)malloc(sizeof(LNode));
printf("data:");scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p =q;



//插入一个元素
void insert_list(LNode *head,int x,int i )


int j=0;
LNode *p,*s;
p=head;

while((p!=NULL)&&(j<i-1))

p=p->next;
j++;


if(p==NULL) exit(0);

s=(Llist)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;



//删除一个元素
int delete_list(LNode *head,int i)


LNode *p,*q;
int j=0;
int x;

p=head;

while((p!=NULL)&&(j<i-1))

p=p->next;
j++;


if(p==NULL) exit(0);

q=p->next;
p->next=q->next;
x=q->data;
free(q);

return(x);


大哥 这可是我一个字符一个字符的敲进去的啊~~~!!!
我是学软件工程的,这是线性表的链式存储结构..本回答被提问者采纳
参考技术B 给你一个更简单的:

#include<iostream>
#include<string>
using namespace std;

struct List

int num;
List *next;
;

List *head=NULL;

List* CreateList()

List *pL;
List *pEnd;

pL=new List;
head=pL;
pEnd=pL;
cout<<"请输入节点的数目,以 0 结束"<<endl;
cin>>pL->num;
while(pL->num!=0)

pEnd->next=pL;
pEnd=pL;
pL=new List;
cin>>pL->num;


delete pL;
pEnd->next=NULL;
return head;

void ShowList(List *head)

cout<<endl;
cout<<"链表节点如下:"<<endl;
while(head)

cout<<head->num<<endl;
head=head->next;


void InsertList(List *head,int num)


List *list =new List;
List *l;
while(head)

l=head;
head=head->next;

list->num=num;
list->next=NULL;
l->next=list;



void DeleteList(List *head, int num)


List *l;
if(head->num==num)

l=head;
head=head->next;
::head=head;
delete l;
return ;


List *l1=head;
while(head)

if(head->next==NULL)
cout<<"找不到不要删除的数字."<<endl;
return ;


if(head->next->num==num)

l=head->next;
head->next=l->next;
delete l;
::head=l1;
cout<<"操作成功"<<endl;
return ;

head=head->next;


cout<<"找不到不要删除的数字."<<endl;


int GetListNum(List *head)

int num=0;
while(head)

num++;
head=head->next;


return num;


int main()

string str;

begin:
cout<<"1->增加链表 2->显示链表 3->插入节点 4->删除节点 5->节点数目"<<endl;
cin>>str;
if(str[0]=='1')

CreateList();

else if(str[0]=='2')

if(head==NULL)

cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;

ShowList(head);

else if(str[0]=='3')

if(head==NULL)

cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;

int num;
cout<<"请输入要插入的数字:"<<endl;
cin>>num;
InsertList(head,num);

else if(str[0]=='4')

if(head==NULL)

cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;

int num;
cout<<"请输入要删除的数字:"<<endl;
cin>>num;
DeleteList(head,num);

else if(str[0]=='5')

cout<<"节点数是:"<<GetListNum(head)<<endl;

else

cout<<"输入错误,请重新输入.";

if(str[0]!='Q' && str[0]!='q')

cout<<endl<<endl;
getchar();
getchar();
system("cls");

goto begin;


参考技术C /*创建包含学号、姓名节点的单链表。其节点数任意个,表以学号为序,低学号的在前,高学号的在后,以输入姓名为空作结束。在此链表中,要求删除一个给定姓名的节点,并插入一个给定学号和姓名的节点。*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct node /*节点的数据结构*/

int num;
char str[20];
struct node *next;
;

main( )

/*函数声明*/
struct node* creat(struct node *head);
struct node* insert(struct node *head, char *pstr, int n);
struct node* delet(struct node *head, char *pstr);
void print(struct node *head);
struct node *head;
char str[20];
int n;
head=NULL; /*做空表*/
head=creat(head); /*调用函数创建以head 为头的链表*/
print(head);/*调用函数输出节点*/
printf("\n input inserted num,name:\n");
gets(str); /*输入学号*/
n=atoi (str);
gets(str); /*输入姓名*/
head=insert(head, str, n); /*将节点插入链表*/
print (head); /*调用函数输出节点*/
printf("\n input deleted name:\n");
gets(str); /*输入被删姓名*/
head=delet(head,str); /*调用函数删除节点*/
print (head); /*调用函数输出节点*/
system("pause");
return 0;


/* * * 创建链表* * * * * * * * * * * */
struct node *creat(struct node *head)

char temp[30];
struct node *p1,*p2;
p1 = p2=(struct node*) malloc(sizeof(struct node));
printf ("input num, name: \n;");
printf("exit:double times Enter!\n");
gets(temp) ;
gets(p1->str);
p1->num=atoi (temp);
p1->next =NULL;
while (strlen(p1->str)>0)

if (head == NULL) head = p1;
else p2->next=p1;
p2 = p1;
p1=(struct node *)malloc(sizeof(struct node));
printf ("input num, name: \n");
printf("exit:double times Enter!\n");
gets(temp ) ;
gets(p1->str);
p1->num=atoi (temp);
p1->next = NULL;

return head;

/* * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * 插入节点* * * * * * * * * */
struct node *insert (struct node *head, char *pstr, int n)

struct node *p1,*p2,*p3;
p1=(struct node*)malloc(sizeof(struct node));
strcpy (p1->str, pstr);
p1->num = n ;
p2 = head ;
if ( head == NULL )

head = p1 ; p1->next = NULL ;

else

while (n>p2->num&&p2->next!=NULL)

p3 = p2;
p2 = p2->next;

if (n<=p2->num)
if (head==p2)

head = p1 ;
p1->next = p2 ;

else

p3->next = p1 ;
p1->next = p2 ;

else

p2->next = p1;
p1->next = NULL ;


return (head) ;

/* * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * 删除节点* * * * * * * * * * * * */
struct node *delet (struct node *head, char *pstr)

struct node *temp,*p;
temp = head ;
if (head==NULL)
printf("\nList is null!\n");
else

temp = head ;
while (strcmp(temp->str,pstr)!=0&&temp->next!=NULL)

p = temp;
temp = temp->next;

if (strcmp(temp->str , pstr ) == 0 )

if (temp== head)

head = head->next ;
free(temp) ;

else

p->next =temp->next;
printf("delete string :%s\n",temp->str);
free(temp) ;


else printf("\nno find string!\n");

return(head);

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * 链表各节点的输出* * * * * * * * * */
void print (struct node *head)

struct node *temp;
temp =head ;
printf("\n output strings:\n");
while (temp!=NULL)

printf( "\n%d - - - - %s\n" , temp->num ,temp->str );
temp = temp->next;

链表——链表删除冗余结点&amp;插入结点到有序链表

1.一个以递增方式排列的链表,去掉链表中的冗余值。
思路一:设有两个指针p和q。使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除。


思路二:设有两个指针p和q,使p在前,q在后,仅仅要找到一个冗余就删除一个,依次往后删除。
输入的链表:1 3 3 3 3 6 6 8 9 10
删除后的链表:1 3 6 8 9 10
比較两种思路。思路二的想法相比于思路一要好。所以这里实现思路二的代码。
2.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表。然后相相应的查找这个结点须要插入的位置。对于递增链表来说,须要查找到第一个节点值大于等于要插入的结点,然后将须要插入的结点插入到该结点前面;对于递减链表来说,须要查找到第一个小于等于要插入的结点。然后将须要插入的结点插入到该结点前面。须要考虑的特殊情况是插入的结点可能会插入在第一个位置。


#include <stdio.h>
#include <malloc.h>

#define NULL	0

typedef struct node {
	int data;
	struct node *next;
}ElemSN;


ElemSN * creat_link(int ms); //逆向创建一个链表
void print_link(ElemSN *head); //输出单向链表
void delete_rdy(ElemSN *head); //删除冗余的项
ElemSN * insert_node(ElemSN *head, int x); //插入结点到有序链表
ElemSN * clear_link(ElemSN *head); //删除链表

int main()
{
	ElemSN *head;
	int ms, x;

	printf("Please input node number:");
	scanf("%d", &ms);
	head = creat_link(ms); //创建链表
	print_link(head);
	delete_rdy(head);
	print_link(head);
	head = insert_node(head, 5);
	print_link(head);
	head = clear_link(head); //删除链表
}

ElemSN * creat_link(int ms)
{
	ElemSN *h = NULL, *p;
	int i, x;

	for(i = 0; i < ms; i++)
	{
		printf("Please input data:");
		scanf("%d", &x);
		p = (ElemSN *)malloc(sizeof(ElemSN));
		p->data = x;
		p->next = h;
		h = p;
	}

	return h;
}

void print_link(ElemSN *head)
{
	for(; head; head = head->next)
	{
		printf("%d ", head->data);
	}
	printf("\n");
}

void delete_rdy(ElemSN *head)
{
	ElemSN *p, *q;

	if(NULL == head)
		return;
	p = head;
	q = p->next;
	while(q)
	{
		if(p->data == q->data)
		{
			p->next = q->next;
			free(q);
			q = p->next;
		}
		else
		{
			p = q;
			q = p->next;
		}
	}
}

ElemSN * insert_node(ElemSN *head, int x)
{
	ElemSN *p, *q;

	if(NULL == head || NULL == head->next)
		return NULL;
	p = head;
	q = head; //这里不能赋值为head->next,比較必须从第一个结点開始
	if(q->data >= q->next->data) //递减链表
	{
		for(; q && q->data >= x; p = q, q = q->next){}
	}
	else //递增链表
	{
		for(; q && q->data <= x; p = q, q = q->next){}
	}

	if(NULL == q) //插入在链表尾部
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = NULL;
		p->next = q;
	}
	else if(q == head) //插入在表首
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = head;
		head = q;
	}
	else //插入在中间位置
	{
		p->next = (ElemSN *)malloc(sizeof(ElemSN));
		p->next->next = q;
		p->next->data = x;
	}

	return head;
}

ElemSN * clear_link(ElemSN *head)
{
	ElemSN *p;

	while(head)
	{
		p = head->next;
		free(head);
		head = p;
	}

	return head;
}

以上是关于求C语言 数据结构中的链表创建,插入和删除代码的主要内容,如果未能解决你的问题,请参考以下文章

c语言 双向链表的简单操作-创建插入删除

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

C中的链表数组:初始化和插入?

线性表的插入和删除操作代码(C语言)

单链表

链表——链表删除冗余结点&amp;插入结点到有序链表