單鏈表插入(完整版程式 在表頭和表尾插入演算法)
阿新 • • 發佈:2019-01-09
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define N 3
typedef struct node
{
char name[20];
struct node *next;
}ListNode;
ListNode *creat(int n)
{
ListNode *p,*h,*s;
int i;
if((h=(ListNode*)malloc(sizeof(ListNode)))==NULL)
{
printf ("不能分配記憶體空間!");
exit(0);
}
h->name[0] = '\0';
h->next=NULL;
p = h;
for(i = 0;i<n;i++)
{
if((s=(ListNode*)malloc(sizeof(ListNode)))==NULL)
{
printf("不能分配記憶體空間!");
exit(0);
}
p->next = s;
printf("請輸入第%d個人的名字",i+1);
scanf("%s",s->name);
s ->next = NULL;
p = s;
}
return(h);
}
void printList(ListNode *p)
{
while(p->next)
{
p = p->next;
printf("%s\n",p->name);
}
}
void reverse(ListNode *p)
{
ListNode *a,*b,*c;
a = p;
b = p->next;
while(b->next!=NULL)
{
c=b->next;
b->next = a;
a = b;
b=c;
}
b->next = a;
p->next->next = NULL;
p->next=b;
}
void find(ListNode* head,char *t)
{
ListNode *p,*s;
p =head;
while((p->next)&&(strcmp(p->next->name,t)))
p = p->next;
if(p->next)
{
printf("找到了!哦耶\n");
}
else
{
printf("沒找到,大哭!\n");
}
}
void Insert(ListNode* head)
{
char t[10];
ListNode *p,*s;
int i,j;
printf("請輸入要插入的字串:");
scanf("%s",&t);
p = head;
j = 0;
while(p->next&&strcmp(t,p->next->name)>0)
{
j++;
p = p->next;
}
if(!strcmp(t,p->next->name))
printf("重複插入,不允許。\n");
else
{
s = (ListNode*)malloc(sizeof(ListNode));
strcpy(s->name,t);
s->next = p->next;
p->next = s;
}
}
void InsertAtTail(ListNode *pHead)
{
ListNode *pNew;
if((pNew=(ListNode*)malloc(sizeof(ListNode)))==NULL)
{
printf("不能分配記憶體空間!");
exit(0);
}
//pNew->name = value;
printf("請輸入要插入的字串:");
scanf("%s",pNew->name);
while(pHead->next)
{
pHead = pHead->next;
}
pHead->next = pNew;
pNew->next = NULL;
}
void InsertAtHead(ListNode *pHead)
{
ListNode *pNew;
if((pNew=(ListNode*)malloc(sizeof(ListNode)))==NULL)
{
printf("不能分配記憶體空間!");
exit(0);
}
//pNew->name = value;
printf("請輸入要插入的字串:");
scanf("%s",pNew->name);
pNew->next = pHead->next;
pHead->next = pNew;
}
void main()
{
int number;
ListNode *head;
char t1[80];
char *t2;
number = N;
head = creat(number);
printf("建立好的連結串列為:\n");
printList(head);
//reverse(head);
//printf("單鏈表逆置之後:\n");
//printList(head);
//printf("輸入要查詢的字串\n");
// gets(t1);
//scanf("%s",&t1);
//find(head,t1);
//Insert(head);
//printList(head);
InsertAtTail(head);
printList(head);
InsertAtHead(head);
printList(head);
}
這個程式是考慮存在頭結點的情況下。